Romlige forskjeller i næringsstruktur, virkninger av eksogene sjokk i basissysselsettingen, og lokale forskjeller I sysselsettingsvekst.

I denne oppgaven vil vi se på næringsstrukturer på Haugalandet, Sunnhordland og Hardanger.

Problemstillinger og beregninger vi vil se nærmere på

Oversikt over befolkningene i regionene

Haugalandet

Haugalandet består av kommunene Bokn (852), Haugesund (37357), Karmøy (42186), Sauda (4595), Tysvær(11065), Utsira(198) og Vindafjord(8714). tilsammen bor det 104967 personer i denne regionen. i tidsperioden vi har hentet inn data har det vert kommunesammenslåing i denne regionen. Da ble Ølen og vindafjord slått i sammen til en kommune (hvordan har vi tatt hensyn til dette???)

Sunnhordland og Ullensvang

Sunnhordland og Ullensvang består av kommunene Bømlo(11957), Etne(4062), Fitjar(3189), Kvinnherad(13071), Stord(18759), Sveio(5766), Tysnes(2869) og Ullensvang(11048). Tilsammen bor det 70721 personer i denne regionen.

Tallene er hentet fra SSB 09.01.21 (https://www.ssb.no/statbank/table/01223/tableViewLayout1/) gjelder for 4 kvartal 2020.

syssel_arb <- read_csv("Data/syssel_arb.csv", show_col_types = FALSE)
hld_arb <- read_csv("Data/hld_arb.csv", show_col_types = FALSE)
sun_arb <- read_csv("Data/sun_arb.csv", show_col_types = FALSE)
har_arb <- read_csv("Data/har_arb.csv", show_col_types = FALSE)
syssel_bos <- read_csv("Data/syssel_bos.csv", show_col_types = FALSE)
hld_bos <- read_csv("Data/hld_bos.csv", show_col_types = FALSE)
sun_bos <- read_csv("Data/sun_bos.csv", show_col_types = FALSE)
har_bos <- read_csv("Data/har_bos.csv", show_col_types = FALSE)
Pendling <- read_csv("Data/Pendling.csv", show_col_types = FALSE)
hgl_Pendling <- read_csv("Data/hgl_Pendling.csv", show_col_types = FALSE)
sun_Pendling <- read_csv("Data/sun_Pendling.csv", show_col_types = FALSE)

1 Sysselsetting i ulike næringer, etter arbeidssted

Haugalandet

Første regionen vi velger å se på er Haugalandet. Her ønsker vi å se på utviklingen fra 2008 til 2020, av antall ansatte i sin helhet i regionen, samt de 6 mest relevante næringene.

<<<<<<< HEAD

=======
hld_arb %>% 
  ggplot(mapping = aes(x = År, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Fig. 1: Haugalandet")+
  ylab("Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

I 2020 er det i underkant av 50 000 ansatte i alle næringer på Haugalandet. Av Fig. 1 ser vi at Haugalandet fikk en nedgang i antall ansatte i 2015 og 2016. I 2017 og 2018 ble det vekst, frem til det snudde i 2019 igjen.

<<<<<<< HEAD

=======
syssel_arb %>% 
  filter(knr %in% c(1106, 1135, 1145, 1146, 1149, 1151, 1160)) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = `Alle Næringer`, (angle=0))) +
  scale_fill_distiller(palette = "Dark2") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  labs(title = "Fig. 2: Haugalandet", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

I Fig. 2 ser vi at flere av kommunene på Haugalandet har hatt liten arbeidsplassvekst, med unntak av Tysvær, Vindafjord og Karmøy i den siste tiårsperioden. Vi ser dette mer tydelig på fig. 3 og 4.

hld_arb_long <- syssel_arb %>%
  pivot_longer(
    cols = `Alle Næringer`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
<<<<<<< HEAD =======
hld_arb_long %>% 
  filter(knavn %in% c("Haugesund", "Karmøy", "Vindafjord")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = aar, y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. 3: Haugalandet: Haugesund, Karmøy og Vindafjord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom') + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 2)) + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
hld_arb_long %>% 
  filter(knavn %in% c("Bokn", "Sauda", "Tysvær", "Utsira")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = aar, y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. 4: Haugalandet: Bokn, Sauda Tysvær og Utsira", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom') + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 2)) + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Figur 3 og 4 viser utviklingen av det totale antall ansatte i alle næringer på kommunalt nivå, innenfor Haugaland-regionen.

I disse figurene, så ser vi tydelig at Haugesund har hatt reduksjon i antall ansatte totalt sett, mens Karmøy, Vindafjord og Tysvær har hatt en markant vekst de siste ti årene. Siden Haugesund har flest arbeidsplasser betyr utviklingen i Haugesund mye for de samlede tallene.

<<<<<<< HEAD
Warning: Removed 1 row(s) containing missing values (geom_path).

=======
hld_arb_long %>% 
  filter(knavn %in% c("Haugesund", "Karmøy", "Vindafjord")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Fig. 5: Haugalandet: Haugesund, Karmøy og Vindafjord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD
Warning: Removed 1 row(s) containing missing values (geom_path).

=======
hld_arb_long %>% 
  filter(knavn %in% c("Bokn", "Sauda", "Tysvær", "Utsira")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Fig. 6: Haugalandet: Bokn, Sauda, Tysvær og Utsira", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Figur 5 og 6 viser utviklingen av de 6 mest relevante næringene i Haugalandsregionen på kommune nivå.

Vi ser i de tre største kommunene, Haugesund, Karmøy og Vindafjord utgjør næringene Helse- og Sosialtjenester og Industri de største. Helse- og Sosialtjenester har vokst jevnt og trutt de siste tiårene, mens antall ansatte i industrinæringen har variert fra kommune til kommune. I Haugalandet utgjør primærnæringer (jordbruk, Skogbrug og Fiske) en større andel, enn hos Karmøy og Haugesund hvor primærnæringene kun utgjøre en liten andel.

Sysselsettingsutviklingen for ulike næringer i ulike kommuner og for regionen samlet.

Det er relativt store kommunevise forskjeller i næringsstrukturen. Rogaland har en forholdsvis ensidig næringsstruktur, olje og gass er dominerende. Fylket er suverent dominerende for fossil energi. De har for øvrig de siste årene satset på et en mer differensiert næringsstruktur og næringsliv ved å satse på helse, IKT og fornybar energi.

I våre modeller, er satsingen på helse den mest tydelige. Av rent tekniske grunner er det vanskelig å se utviklingen i enkelte næringer som utgjør små andeler, på grunn av skalaen som er benyttet. Til tross for dette, kan man se at næringsstrukturen i regionen samlet generelt sett har endret seg lite.

Rogaland har gode jordbruksmuligheter, men i Fig. 2: Haugalandet ser vi en nedgang i sysselsettingen de siste tiårene, mens det er en marginal økning i Sunnhordaland, jf. Fig 9. I Fig. 12: ser vi at Tysnes har hatt en markant økning i primærnæringen, relativt sett.

Universitets- og høgskolesektoren er liten i Rogaland, og den består for det første av Universitetet i Stavanger (UiS) og Høgskulen på Vestlandet (HVL) med campus Haugesund.

Haugaland Vekst, som er eigd/drevet av Haugalandsregionen er i spissen på å legge til rette for å etablere ny industri samt andre arbeidsplasser i regionen.

I helsesektoren er Stavanger universitetssykehus (SuS) sentralt.

Sunnhordland

Videre ønsker vi å se på den samme utviklingen, men denne gangen i Sunnhordlandsregionen.

<<<<<<< HEAD

=======
sun_arb %>% 
  ggplot(mapping = aes(x = År, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Fig. 7: Sunnhordaland", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Her viser figur 7 utviklingen til den totale summen av ansatte i Sunnhordlandsregionen fra 2008 til 2020. Sunnhordaland har i 2020 i underkant av 25 500 ansatte. Vi ser ut ifrå figuren at Sunnhordlandsregionen hadde ein markant vekst ifrå 2008 til 2014 med periodar med svak nedgang. Fra 2014 har det vært en reduksjon i totalt antall ansatte.

<<<<<<< HEAD

=======
syssel_arb %>% 
  filter(knr %in% c(4611, 4612, 4613, 4614, 4615, 4616, 4617)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_fill_distiller(palette = "Dark2") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Fig. 8: Sunnhordland", x = "År") +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Figur 8 viser utviklingen av totalt ansatte i Sunnhordlandsregionen på kommunenivå i hele regionen fra 2008 til 2020. Denne figuren gir oss en oversikt, men er ikke heilt brukervennelig. Vi lager dermed en mer oversiktlig figur, jf. figur 9 & 10.

<<<<<<< HEAD

=======
sun_arb_long <- syssel_arb %>%
  pivot_longer(
    cols = `Alle Næringer`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
sun_arb_long %>% 
  filter(knavn %in% c("Bømlo", "Kvinnherad", "Stord")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = aar, y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. 9: Sunnhordland: Bømlo, Kvinnherad og Stord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom') + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 2)) + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
sun_arb_long %>% 
  filter(knavn %in% c("Etne", "Fitjar", "Sveio", "Tysnes")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = aar, y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. 10: Sunnhordland: Etne, Fithar, Sveio og Tysnes", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom') + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 2)) + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Vi ser her ut ifra figur 9 og 10 utviklingen for hver enkelt kommune i Sunnhordland totalt sett, og her ser vi mye tydligere utviklingen fra 2008 til 2020. En kan se her at Kvinnherad, Etne og Fitjar har hatt en reduksjon i totalt ansatte, mens Tysnes og Sveio har hatt ein kraftig vekst. En interessant bemerking er Stord i 2014 og Kvinnherad fra 2008 til 2017.

For å få et bedre oversikt over utviklingen i kommunen ønsker vi å se på de 6 mest relevante næringene i hver kommune.

<<<<<<< HEAD

=======
sun_arb_long %>% 
  filter(knavn %in% c("Bømlo", "Stord", "Kvinnherad")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = aar, y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Fig. 11: Sunnhordland: Bømlo, Kvinnherad og Stord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom') + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 2)) + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD
Warning: Removed 1 row(s) containing missing values (geom_path).

=======
sun_arb_long %>% 
  filter(knavn %in% c("Etne", "Sveio", "Fitjar", "Tysnes")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Fig. 12: Sunnhordland: Etne, Fitjar, Sveio og Tysnes", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Figur 11 og 12 viser de 6 mest relevante næringene i hver enkelt kommune i Sunnhordlandsregionen fra 2008 til 2020.

En ser ut ifra figur 11 at i de tre største kommunene, Bømlo, Kvinnherad og Stord så har de alle hatt en reduksjon i industrien, samtidig som de har hatt en vekst i helse- og sosialtjenester. Tysnes har vært stabil når det kommer til industri, men har sett ein markant vekst i primærnæringen (Jordbruk, Skogbruk og Fiske).

Sysselsettingsutviklingen for ulike næringer i ulike kommuner og for regionen samlet.

Det første bemerkelsesverdige i Sunnhordlandsregionen er den markante reduksjonen i industri i Stord kommune i 2014, samt Kvinnherad fra 2008. Dette stemmer overens med to hendelser. Den første er oljeknekken i 2014 som medførte at bl.a. Aker Stord AS som er avhengig av Olje-industrien måtte permitere.

Stord er en kommune som har mye offshore industri. I 2008/2009 så stengte Sør-Norge Aluminium “B-Hallen” som medførte 50% reduksjon i produksjon, og dermed ansatte. Interessant å bemerke at i Kvinnherad så er antall industriarbeidere redusert samtidig som antall ansatte i Helse- og Sosialetjenester økt. Bømlo har også sett en stabil reduksjon i ansatte innen industri, samt vekst i Helse- og Sosialetjenester frem til 2018.

Ser en på hele Sunnhordlandsregionen i sin helhet, så ser vi en svært tydelig vekst innen Helse- og Sosialetjenester, og reduksjon innen industri i hele regionen. Kvinnherad, Tysnes og Fitjar har opplevd ein markant vekst innen primærnæring. Kan det vere ein grunn til dette som burde diskuterast??

Fortsett Her (OA, KH)

Hardanger

Til slutt må vi gjere det samme med Hardanger

I henhold til oppgavens krav til betrakter vi Hardanger før 2019 som Ullensvang- og Odda kommune som to separerte kommuner. i 2020 så ble Ullensvang, Odda og Jondal slått sammen til Ullensvang. Dette forklarer den voldsomme økningen i sysselsetting i regionen ved tidspunktet for kommunesammenslåing.

<<<<<<< HEAD

=======
har_arb %>% 
  ggplot(mapping = aes(x = År, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Fig. 13: Hardanger", y= "Alle Næringer") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 2))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
syssel_arb %>% 
  filter(knr %in% c(4618, 1228)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_fill_distiller(palette = "Dark2") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_color_manual(values=c('#111111','#054987')) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Fig. 14: Hardanger", x = "År") +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e
har_arb_long <- syssel_arb %>%
  pivot_longer(
    cols = `Alle Næringer`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
<<<<<<< HEAD

=======
har_arb_long %>% 
  filter(knavn %in% c("Odda", "Ullensvang")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. 15: Hardanger: Odda og Ullensvang", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD
Warning: Removed 1 row(s) containing missing values (geom_path).

=======
har_arb_long %>% 
  filter(knavn %in% c("Odda", "Ullensvang")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Fig. 16: Hardanger: Odda, Ullensvang", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Ullensvang kommune har stor kraftproduksjon og hovednæringen er industri. Majoriteten av kraftproduksjonen foregår i tidligere Odda. Odda er et ensidig industristed, men har også en maritim næring i tillegg. I figur 16 ser vi at industrinæringen utgjør en betraktelig større andel av sysselsettingen i her. Industrinæringen er også omfattet og bygg- og anleggsvirksomhet. På motsatt side er jordbruk, helse- og sosialtjenester dominerende i Ullensvang.

Generelt om Ullensvang kommune

Ullensvang kommune (med Odda) har hatt en jevn og negativ befolkningsvekst i mange tiår. Det gjenspeiles ikke tydelig i våre modeller på grunn av skalaen som er brukt. I tillegg har vi ikke hensyntatt innvandrende arbeidere, eller midlertidige fraflyttede som for eksempel studenter.

2

Finner lokaliseringskvotienter for ulike næringer i ulike kommuner, og for regionen samlet

#ordner etter kommunenavn og år
tmp <- syssel_bos
hau20 <- syssel_bos %>% 
  filter(aar == "2020", knavn == "Haugesund")
(hau20$Industri/hau20$`Alle Næringer`)
1905/18137
syssel_bos <- syssel_bos %>% 
  mutate(Eir_Er_industri = Industri/`Alle Næringer`,
         Eir_Er_Jordbruk = `Jordbruk, Skogbrug og Fiske`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`)
library(readxl)
nasjonalt_bosted <- read_excel("Data/nasjonalt_bosted.xlsx")
nasjonalt_bosted <- nasjonalt_bosted %>% 
  mutate(Ein_En_Industri = Industri/`Alle Næringer`,
         Ein_En_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Ein_En_Undervisning = Undervisning/`Alle Næringer`,
         Ein_En_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`)
syssel_bos <- syssel_bos %>% 
  mutate(LQindustri = LQindustri$andel,
         LQjordbruk = LQjordbruk,
         LQundervisning = LQundervisning,
         LQhelse = LQhelse)
LQbos <- syssel_bos %>% 
  select(aar, knavn, LQindustri, LQjordbruk, LQundervisning, LQhelse)

For region Haugaland:

<<<<<<< HEAD =======
hld_bos_LQ <- hld_bos %>% 
  mutate(Eir_Er_industri = Industri/`Alle Næringer`,
         Eir_Er_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`)
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e
LQindustri_hld <- as_tibble(hld_bos_LQ$Eir_Er_industri/nasjonalt_bosted$Ein_En_Industri)
LQjordbruk_hld <- as_tibble(hld_bos_LQ$Eir_Er_Jordbruk/nasjonalt_bosted$Ein_En_Jordbruk)
LQundervisning_hld <- as_tibble(hld_bos_LQ$Eir_Er_Undervisning/nasjonalt_bosted$Ein_En_Undervisning)
LQhelse_hld <- as_tibble(hld_bos_LQ$Eir_Er_Helse/nasjonalt_bosted$Ein_En_Helse)
hld_bos_LQ <- hld_bos_LQ %>% 
  mutate(LQindustri = LQindustri_hld$value,
         LQjordbruk = LQjordbruk_hld$value,
         LQundervisning = LQundervisning_hld$value,
         LQhelse = LQhelse_hld$value) %>% 
  select(År, LQindustri, LQjordbruk, LQundervisning, LQhelse)

For Sunnhordaland:

sun_bos_LQ <- sun_bos %>% 
  mutate(Eir_Er_industri = Industri/`Alle Næringer`,
         Eir_Er_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`)
LQindustri_sun <- as_tibble(sun_bos_LQ$Eir_Er_industri/nasjonalt_bosted$Ein_En_Industri)
LQjordbruk_sun <- as_tibble(sun_bos_LQ$Eir_Er_Jordbruk/nasjonalt_bosted$Ein_En_Jordbruk)
LQundervisning_sun <- as_tibble(sun_bos_LQ$Eir_Er_Undervisning/nasjonalt_bosted$Ein_En_Undervisning)
LQhelse_sun <- as_tibble(sun_bos_LQ$Eir_Er_Helse/nasjonalt_bosted$Ein_En_Helse)
sun_bos_LQ <- sun_bos_LQ %>% 
  mutate(LQindustri = LQindustri_sun$value,
         LQjordbruk = LQjordbruk_sun$value,
         LQundervisning = LQundervisning_sun$value,
         LQhelse = LQhelse_sun$value) %>% 
  select(År, LQindustri, LQjordbruk, LQundervisning, LQhelse)

For Hardanger:

har_bos_LQ <- har_bos %>% 
  mutate(Eir_Er_industri = Industri/`Alle Næringer`,
         Eir_Er_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`)
LQindustri_har <- as_tibble(har_bos_LQ$Eir_Er_industri/nasjonalt_bosted$Ein_En_Industri)
LQjordbruk_har <- as_tibble(har_bos_LQ$Eir_Er_Jordbruk/nasjonalt_bosted$Ein_En_Jordbruk)
LQundervisning_har <- as_tibble(har_bos_LQ$Eir_Er_Undervisning/nasjonalt_bosted$Ein_En_Undervisning)
LQhelse_har <- as_tibble(har_bos_LQ$Eir_Er_Helse/nasjonalt_bosted$Ein_En_Helse)
har_bos_LQ <- har_bos_LQ %>% 
  mutate(LQindustri = LQindustri_har$value,
         LQjordbruk = LQjordbruk_har$value,
         LQundervisning = LQundervisning_har$value,
         LQhelse = LQhelse_hld$value) %>% 
  select(År, LQindustri, LQjordbruk, LQundervisning, LQhelse)

3 Sysselsetting i ulike næringer, etter bosted (Modeller under arbeid)

Haugalandet

<<<<<<< HEAD

=======
hld_bos %>% 
  ggplot(mapping = aes(x = År, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Haugalandet")+
  ylab("Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
syssel_bos %>% 
  filter(knr %in% c(1106, 1135, 1145, 1146, 1149, 1151, 1160)) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = `Alle Næringer`, (angle=0))) +
  scale_fill_distiller(palette = "Dark2") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  labs(title = "Haugalandet", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e
hld_bos_long <- syssel_bos %>%
  pivot_longer(
    cols = `Alle Næringer`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
<<<<<<< HEAD

=======
hld_bos_long %>% 
  filter(knavn %in% c("Haugesund", "Karmøy", "Vindafjord")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. x: Haugalandet: Haugesund, Karmøy og Vindafjord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
hld_bos_long %>% 
  filter(knavn %in% c("Bokn", "Sauda", "Tysvær", "Utsira")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. x: Haugalandet: Bokn, Sauda Tysvær og Utsira", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
hld_bos_long %>% 
  filter(knavn %in% c("Haugesund", "Karmøy", "Vindafjord")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Haugalandet: Haugesund, Karmøy og Vindafjord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
hld_bos_long %>% 
  filter(knavn %in% c("Bokn", "Sauda", "Tysvær", "Utsira")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Haugalandet: Bokn, Sauda, Tysvær og Utsira", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Sunnhordland

<<<<<<< HEAD

=======
sun_bos %>% 
  ggplot(mapping = aes(x = År, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Sunnhordaland", x = "År", y = "Antall ansatte i  \n alle næringer") +
  theme(axis.title.y = element_text(angle=0))+ 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
syssel_bos %>% 
  filter(knr %in% c(4611, 4612, 4613, 4614, 4615, 4616, 4617)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_fill_distiller(palette = "Dark2") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Sunnhordland", x = "År") +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e
sun_bos_long <- syssel_bos %>%
  pivot_longer(
    cols = `Alle Næringer`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
<<<<<<< HEAD

=======
sun_bos_long %>% 
  filter(knavn %in% c("Bømlo", "Kvinnherad", "Stord")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. x: Sunnhordland: Bømlo, Kvinnherad og Stord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
sun_bos_long %>% 
  filter(knavn %in% c("Etne", "Fitjar", "Sveio", "Tysnes")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. x: Sunnhordland: Etne, Fithar, Sveio og Tysnes", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD
Bokommune k_1106 k_1135 k_1145 k_1146 k_1149 k_1151 k_1160
Haugesund_1106 11714 11 22 1029 2586 3 264
Sauda_1135 31 1789 0 2 6 0 27
Bokn_1145 50 0 223 41 41 0 16
Tysvær_1146 1540 1 33 2270 645 0 267
Karmøy_1149 4916 9 31 712 11637 2 218
Utsira_1151 4 0 0 2 3 85 0
Vindafjord_1160 306 10 1 238 103 0 3231
=======
sun_bos_long %>% 
  filter(knavn %in% c("Bømlo", "Stord", "Kvinnherad")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Sunnhordland: Bømlo, Kvinnherad og Stord", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 3) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
sun_bos_long %>% 
  filter(knavn %in% c("Etne", "Sveio", "Fitjar", "Tysnes")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Sunnhordland: Etne, Fitjar, Sveio og Tysnes", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Hardanger

<<<<<<< HEAD

=======
har_bos %>% 
  ggplot(mapping = aes(x = År, y = `Alle Næringer`)) +
  geom_line() +
  labs(title = "Hardanger", y= "Alle Næringer") + 
  scale_x_continuous(breaks = seq(2008, 2020, by = 1))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
syssel_bos %>% 
  filter(knr %in% c(4618, 1228)) %>% 
  ggplot(mapping = aes(x = aar, y = `Alle Næringer`)) +
  scale_fill_distiller(palette = "Dark2") +
  geom_line(aes(group = knavn, colour = knavn)) +
  scale_color_manual(values=c('#111111','#054987')) +
  scale_size_manual(values = c(seq(2.0, 2, by = -0.1))) +
  geom_hline(yintercept = 0) +
  scale_x_continuous(breaks = seq(2008, 2020, by = 1)) +
   labs(title = "Hardanger", x = "År") +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD =======
har_bos_long <- syssel_bos %>%
  pivot_longer(
    cols = `Alle Næringer`:Uoppgitt,
    names_to = "Næring",
    values_to = "Ansatte")
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
har_bos_long %>% 
  filter(knavn %in% c("Odda", "Ullensvang")) %>% 
  filter(Næring %in% "Alle Næringer") %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_color_viridis(discrete = TRUE, option = "A") +
  labs(title = "Fig. x: Hardanger: Odda og Ullensvang", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD

=======
har_bos_long %>% 
  filter(knavn %in% c("Odda", "Ullensvang")) %>% 
  filter(Næring %in% c("Industri", "Helse- og Sosialtjenester", "Finansiering og Forsikring", "Elektrisitet, Vann og Renovasjon", "Bygge- og Anleggsvirksomhet", "Jordbruk, Skogbrug og Fiske")) %>% 
  ggplot(mapping = aes(x = as.Date(paste0(aar, "-01-01")), y = Ansatte)) +
  scale_fill_distiller(palette = "Dark2") +
  labs(title = "Hardanger: Odda, Ullensvang", x = "År", y = "Antall ansatte") +
  geom_line(mapping = aes(group = Næring, colour = Næring)) +
  facet_wrap(facets = ~ knavn, scales = "free_y", ncol = 2) +
  theme(legend.position = 'bottom')
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e
<<<<<<< HEAD

3.1 Lokaliseringskvotienter

=======

3.1 Lokaliseringskvotienter (Venter på svar frå Inge ang. GINI-verdiar.)

library(readxl)
nasjonalt_arbeidssted <- read_excel("Data/nasjonalt_arbeidssted.xlsx")
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Lokaliseringskvotienter for regionene samlet (Må til litt meir arbeid endo)

<<<<<<< HEAD

Splitting?

Må kanskje finne ut om vi skal dele opp i 2, slik at vi får heile datasettet når vi bruker print()

======= >>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Haugalandet 2008-2020

  • Eir_Er_Jordbruk = Samlet sysselsetting i region Haugalandet
  • Eir_Er_Industri = Samlet sysselsetting innen Industri-sektoren i region Haugalandet
  • Eir_Er_El_Vann_Reno = Samlet sysselsetting innen Eleketrisitet, Vann og Renovasjon-sektoren i region Haugalandet
  • Eir_Er_Bygg_og_Anlegg = Samlet sysselsetting innen Bygge- og Anleggsvirksomhet-sektoren i region Haugalandet
  • Eir_Er_Finans = Samlet sysselsetting innen Finansiering og Forsikring-sektoren i region Haugalandet
  • Eir_Er_Undervisning = Samlet sysselsetting innen Undervisning-sektoren i region Haugalandet
  • Eir_Er_Helse = Samlet sysselsetting innen Helse- og Sosialtjenester-sektoren i region Haugalandet
<<<<<<< HEAD
=======
hld_arb_LQ <- hld_arb %>% 
  # Slik finner vi samlet sysselsetting i Industri i Haugelandet for år 2008-2020
  mutate(Eir_Er_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Eir_Er_Industri = Industri/`Alle Næringer`,
         Eir_Er_El_Vann_Reno = `Elektrisitet, Vann og Renovasjon`/`Alle Næringer`,
         Eir_Er_Bygg_og_Anlegg = `Bygge- og Annleggsvirksomhet`/`Alle Næringer`,
         Eir_Er_Finans = `Finansiering og Forsikring`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`) %>% 
  select(År, `Alle Næringer`, Eir_Er_Jordbruk, Eir_Er_Industri, Eir_Er_El_Vann_Reno, Eir_Er_Bygg_og_Anlegg, Eir_Er_Finans, Eir_Er_Undervisning, Eir_Er_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(hld_arb_LQ,
             col.names = c("År",
                           "Alle",
                           "Jordbruk",
                           "Industri",
                           "Vann",
                           "Bygg",
                           "Finans",
                           "Underv.",
                           "Helse")) %>%
  add_header_above(c("Lokalkvotient, region: Haugalandet"=9))
hld_arb_GINI <- hld_arb %>% 
  mutate(
    GINI_Primær = ((hld_arb$`Jordbruk, Skogbruk og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - hld_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((hld_arb$Industri/nasjonalt_arbeidssted$Industri - hld_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((hld_arb$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - hld_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
hld_arb_GINI <- hld_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / hld_arb$`Jordbruk, Skogbruk og Fiske` / hld_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / hld_arb$Industri / hld_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / hld_arb$`Helse- og Sosialtjenester`/hld_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(hld_arb_GINI,
             col.names = c("År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=2, "GINI" = 3, "RDI" = 3)) %>%
  add_header_above(c("Haugalandet"=8))

Kommunenivå på Haugalandet (Haugesund, Karmøy, Tysvær og Bokn)

Haugesund
Haug_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "1106")
names(Haug_arb_GINI)[[5]] <- "År"
Haug_arb_GINI <- Haug_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Haug_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Haug_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Haug_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Haug_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Haug_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Haug_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Haug_arb_GINI <- Haug_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Haug_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Haug_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Haug_arb_GINI$Industri / Haug_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Haug_arb_GINI$`Helse- og Sosialtjenester`/Haug_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Haug_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>% 
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Haugesund"=9))
Bokn
Bokn_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "1145")
names(Bokn_arb_GINI)[[5]] <- "År"
Bokn_arb_GINI <- Bokn_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Bokn_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Bokn_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Bokn_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Bokn_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Bokn_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Bokn_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Bokn_arb_GINI <- Bokn_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Bokn_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Bokn_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Bokn_arb_GINI$Industri / Bokn_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Bokn_arb_GINI$`Helse- og Sosialtjenester`/Bokn_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Bokn_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Bokn"=9))
Tysvær
Tysv_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "1146")
names(Tysv_arb_GINI)[[5]] <- "År"
Tysv_arb_GINI <- Tysv_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Tysv_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Tysv_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Tysv_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Tysv_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Tysv_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Tysv_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Tysv_arb_GINI <- Tysv_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Tysv_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Tysv_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Tysv_arb_GINI$Industri / Tysv_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Tysv_arb_GINI$`Helse- og Sosialtjenester`/Tysv_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Tysv_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Tysvær"=9))
Karmøy
Karm_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "1149")
names(Karm_arb_GINI)[[5]] <- "År"
Karm_arb_GINI <- Karm_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Karm_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Karm_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Karm_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Karm_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Karm_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Karm_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Karm_arb_GINI <- Karm_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Karm_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Karm_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Karm_arb_GINI$Industri / Karm_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Karm_arb_GINI$`Helse- og Sosialtjenester`/Karm_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Karm_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Karmøy"=9))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Sunnhordland 2008-2020

  • Eir_Er_Jordbruk = Samlet sysselsetting i region Sunnhordland
  • Eir_Er_Industri = Samlet sysselsetting innen Industri-sektoren i region Sunnhordland
  • Eir_Er_El_Vann_Reno = Samlet sysselsetting innen Eleketrisitet, Vann og Renovasjon-sektoren i region Sunnhordland
  • Eir_Er_Bygg_og_Anlegg = Samlet sysselsetting innen Bygge- og Anleggsvirksomhet-sektoren i region Sunnhordland
  • Eir_Er_Finans = Samlet sysselsetting innen Finansiering og Forsikring-sektoren i region Sunnhordland
  • Eir_Er_Undervisning = Samlet sysselsetting innen Undervisning-sektoren i region Sunnhordland
  • Eir_Er_Helse = Samlet sysselsetting innen Helse- og Sosialtjenester-sektoren i region Sunnhordland
<<<<<<< HEAD
=======
sun_arb_LQ <- sun_arb %>% 
  # Slik finner vi samlet sysselsetting i Industri i Sunnhordland for år 2008-2020
  mutate(Eir_Er_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Eir_Er_Industri = Industri/`Alle Næringer`,
         Eir_Er_El_Vann_Reno = `Elektrisitet, Vann og Renovasjon`/`Alle Næringer`,
         Eir_Er_Bygg_og_Anlegg = `Bygge- og Annleggsvirksomhet`/`Alle Næringer`,
         Eir_Er_Finans = `Finansiering og Forsikring`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`) %>% 
  select(År, `Alle Næringer`, Eir_Er_Jordbruk, Eir_Er_Industri, Eir_Er_El_Vann_Reno, Eir_Er_Bygg_og_Anlegg, Eir_Er_Finans, Eir_Er_Undervisning, Eir_Er_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(sun_arb_LQ,
             col.names = c("År",
                           "Alle",
                           "Jordbruk",
                           "Industri",
                           "Vann",
                           "Bygg",
                           "Finans",
                           "Underv.",
                           "Helse")) %>%
  add_header_above(c("Lokalkvotienten, region: Sunnhordland"=9))
sun_arb_GINI <- sun_arb %>% 
  mutate(
    GINI_Primær = ((sun_arb$`Jordbruk, Skogbruk og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - sun_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((sun_arb$Industri/nasjonalt_arbeidssted$Industri - sun_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((sun_arb$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - sun_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
sun_arb_GINI <- sun_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / sun_arb$`Jordbruk, Skogbruk og Fiske` / sun_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    RDI_Industri = 1 / sun_arb$Industri / sun_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    RDI_Helse = 1 / sun_arb$`Helse- og Sosialtjenester`/sun_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(sun_arb_GINI,
             col.names = c("År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=2, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Region: Sunnhordland"=8))

Kommunenivå i Sunnhordland (Stord, Kvinnherad, Bømlo og Sveio)

Stord
Stord_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "4614")
names(Stord_arb_GINI)[[5]] <- "År"
Stord_arb_GINI <- Stord_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Stord_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Stord_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Stord_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Stord_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Stord_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Stord_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Stord_arb_GINI <- Stord_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Stord_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Stord_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Stord_arb_GINI$Industri / Stord_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Stord_arb_GINI$`Helse- og Sosialtjenester`/Stord_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Stord_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Stord"=9))
Kvinnherad
Kvinn_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "4617")
names(Kvinn_arb_GINI)[[5]] <- "År"
Kvinn_arb_GINI <- Kvinn_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Kvinn_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Kvinn_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Kvinn_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Kvinn_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Kvinn_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Kvinn_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Kvinn_arb_GINI <- Kvinn_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Kvinn_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Kvinn_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Kvinn_arb_GINI$Industri / Kvinn_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Kvinn_arb_GINI$`Helse- og Sosialtjenester`/Kvinn_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Kvinn_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Kvinnherad"=9))
Bømlo
Bømlo_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "4613")
names(Bømlo_arb_GINI)[[5]] <- "År"
Bømlo_arb_GINI <- Bømlo_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Bømlo_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Bømlo_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Bømlo_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Bømlo_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Bømlo_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Bømlo_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Bømlo_arb_GINI <- Bømlo_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Bømlo_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Bømlo_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Bømlo_arb_GINI$Industri / Bømlo_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Bømlo_arb_GINI$`Helse- og Sosialtjenester`/Bømlo_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Bømlo_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Bømlo"=9))
Sveio
Sveio_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "4612")
names(Sveio_arb_GINI)[[5]] <- "År"
Sveio_arb_GINI <- Sveio_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Sveio_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Sveio_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Sveio_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Sveio_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Sveio_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Sveio_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Sveio_arb_GINI <- Sveio_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Sveio_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Sveio_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Sveio_arb_GINI$Industri / Sveio_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Sveio_arb_GINI$`Helse- og Sosialtjenester`/Sveio_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Sveio_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Sveio"=9))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Hardanger 2008-2020

  • Eir_Er_Jordbruk = Samlet sysselsetting i region Hardanger
  • Eir_Er_Industri = Samlet sysselsetting innen Industri-sektoren i region Hardanger
  • Eir_Er_El_Vann_Reno = Samlet sysselsetting innen Eleketrisitet, Vann og Renovasjon-sektoren i region Hardanger
  • Eir_Er_Bygg_og_Anlegg = Samlet sysselsetting innen Bygge- og Anleggsvirksomhet-sektoren i region Hardanger
  • Eir_Er_Finans = Samlet sysselsetting innen Finansiering og Forsikring-sektoren i region Hardanger
  • Eir_Er_Undervisning = Samlet sysselsetting innen Undervisning-sektoren i region Hardanger
  • Eir_Er_Helse = Samlet sysselsetting innen Helse- og Sosialtjenester-sektoren i region Hardanger
<<<<<<< HEAD =======
har_arb_LQ <- har_arb %>% 
  # Slik finner vi samlet sysselsetting i Industri i Hardanger for år 2008-2020
  mutate(Eir_Er_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Eir_Er_Industri = Industri/`Alle Næringer`,
         Eir_Er_El_Vann_Reno = `Elektrisitet, Vann og Renovasjon`/`Alle Næringer`,
         Eir_Er_Bygg_og_Anlegg = `Bygge- og Annleggsvirksomhet`/`Alle Næringer`,
         Eir_Er_Finans = `Finansiering og Forsikring`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`) %>% 
  select(År, `Alle Næringer`, Eir_Er_Jordbruk, Eir_Er_Industri, Eir_Er_El_Vann_Reno, Eir_Er_Bygg_og_Anlegg, Eir_Er_Finans, Eir_Er_Undervisning, Eir_Er_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(har_arb_LQ,
             col.names = c("År",
                           "Alle",
                           "Jordbruk",
                           "Industri",
                           "Vann",
                           "Bygg",
                           "Finans",
                           "Underv.",
                           "Helse")) %>%
  add_header_above(c("Lokalkvotient, region: Hardanger"=9))
har_arb_GINI <- har_arb %>% 
  mutate(
    GINI_Primær = ((har_arb$`Jordbruk, Skogbruk og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - har_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((har_arb$Industri/nasjonalt_arbeidssted$Industri - har_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((har_arb$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - har_arb$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
har_arb_GINI <- har_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / har_arb$`Jordbruk, Skogbruk og Fiske` / har_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    RDI_Industri = 1 / har_arb$Industri / har_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    RDI_Helse = 1 / har_arb$`Helse- og Sosialtjenester`/har_arb$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`)  %>%
  
  select(År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(har_arb_GINI,
             col.names = c("År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=2, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Region: Hardanger"=8))

Kommunenivå i Hardanger (Odda og Ullensvang)

Odda
nasjo_arb_red <- nasjonalt_arbeidssted %>% 
  filter(aar %in% c(2008:2019))
Odda_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "1228")
names(Odda_arb_GINI)[[5]] <- "År"
Odda_arb_GINI <- Odda_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Odda_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjo_arb_red$`Jordbruk, Skogbruk og Fiske` - Odda_arb_GINI$`Alle Næringer`/nasjo_arb_red$`Alle Næringer`)^2),
    
    GINI_Industri = ((Odda_arb_GINI$Industri/nasjo_arb_red$Industri - Odda_arb_GINI$`Alle Næringer`/nasjo_arb_red$`Alle Næringer`)^2),
    
    GINI_Helse = ((Odda_arb_GINI$`Helse- og Sosialtjenester`/nasjo_arb_red$`Helse- og Sosialtjenester` - Odda_arb_GINI$`Alle Næringer`/nasjo_arb_red$`Alle Næringer`)^2))
Odda_arb_GINI <- Odda_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Odda_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Odda_arb_GINI$`Alle Næringer` -
  nasjo_arb_red$`Jordbruk, Skogbruk og Fiske` / nasjo_arb_red$`Alle Næringer`,
    
    RDI_Industri = 1 / Odda_arb_GINI$Industri / Odda_arb_GINI$`Alle Næringer` -
  nasjo_arb_red$Industri / nasjo_arb_red$`Alle Næringer`,
    
    RDI_Helse = 1 / Odda_arb_GINI$`Helse- og Sosialtjenester`/Odda_arb_GINI$`Alle Næringer` -
  nasjo_arb_red$`Helse- og Sosialtjenester`/nasjo_arb_red$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Odda_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Odda(-2019)"=9))
Ullensvang
Ullen_arb_GINI <- syssel_arb %>% 
  filter(knr %in% "4618")
names(Ullen_arb_GINI)[[5]] <- "År"
Ullen_arb_GINI <- Ullen_arb_GINI %>% 
  mutate(
    GINI_Primær = ((Ullen_arb_GINI$`Jordbruk, Skogbrug og Fiske`/nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` - Ullen_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Industri = ((Ullen_arb_GINI$Industri/nasjonalt_arbeidssted$Industri - Ullen_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2),
    
    GINI_Helse = ((Ullen_arb_GINI$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Helse- og Sosialtjenester` - Ullen_arb_GINI$`Alle Næringer`/nasjonalt_arbeidssted$`Alle Næringer`)^2))
Ullen_arb_GINI <- Ullen_arb_GINI %>% 
  mutate(
    RDI_Primær = 1 / Ullen_arb_GINI$`Jordbruk, Skogbrug og Fiske` / Ullen_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Jordbruk, Skogbruk og Fiske` / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Industri = 1 / Ullen_arb_GINI$Industri / Ullen_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$Industri / nasjonalt_arbeidssted$`Alle Næringer`,
    
    RDI_Helse = 1 / Ullen_arb_GINI$`Helse- og Sosialtjenester`/Ullen_arb_GINI$`Alle Næringer` -
  nasjonalt_arbeidssted$`Helse- og Sosialtjenester`/nasjonalt_arbeidssted$`Alle Næringer`) %>% 
  
  select(knr, År, `Alle Næringer`, GINI_Primær, GINI_Industri, GINI_Helse, RDI_Primær, RDI_Industri, RDI_Helse) %>% 
  mutate_if(is.numeric, round, digits=6)
kable(Ullen_arb_GINI,
             col.names = c("Knr",
                           "År",
                           "Alle",
                           "Primær",
                           "Industri",
                           "Helse",
                           "Primær",
                           "Industri",
                           "Helse")) %>%
  add_header_above(c(" "=3, "GINI" = 3, "RDI" = 3)) %>% 
  add_header_above(c("Ullensvang"=9))
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Nasjonalt??

<<<<<<< HEAD =======
syssel_arb <- syssel_arb %>% 
  mutate(Eir_Er_Jordbruk = `Jordbruk, Skogbrug og Fiske`/`Alle Næringer`,
         Eir_Er_Industri = Industri/`Alle Næringer`,
         Eir_Er_El_Vann_Reno = `Elektrisitet, Vann og Renovasjon`/`Alle Næringer`,
         Eir_Er_Bygg_og_Anlegg = `Bygge- og Anleggsvirksomhet`/`Alle Næringer`,
         Eir_Er_Finans = `Finansiering og Forsikring`/`Alle Næringer`,
         Eir_Er_Undervisning = Undervisning/`Alle Næringer`,
         Eir_Er_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`)
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD =======
nasjonalt_arbeidssted <- nasjonalt_arbeidssted %>% 
  mutate(Ein_En_Jordbruk = `Jordbruk, Skogbruk og Fiske`/`Alle Næringer`,
         Ein_En_Industri = Industri/`Alle Næringer`,
         Ein_En_El_Vann_Reno = `Elektrisitet, Vann og Renovasjon`/`Alle Næringer`,
         Ein_En_Bygg_og_Anlegg = `Bygge- og Anleggsvirksomhet`/`Alle Næringer`,
         Ein_En_Finans = `Finansiering og Forsikring`/`Alle Næringer`,
         Ein_En_Undervisning = Undervisning/`Alle Næringer`,
         Ein_En_Helse = `Helse- og Sosialtjenester`/`Alle Næringer`)


LQ_arb_Jordbruk <- syssel_arb %>% 
  select(aar, knavn, Eir_Er_Jordbruk) %>% 
  mutate(aar = as.character(aar)) %>% 
  left_join(select(.data = nasjonalt_arbeidssted, aar, Ein_En_Jordbruk), by = c("aar")) %>% 
  mutate(andel = Eir_Er_Jordbruk/Ein_En_Jordbruk)


LQ_arb_Industri <- syssel_arb %>% 
  select(aar, knavn, Eir_Er_Industri) %>% 
  mutate(aar = as.character(aar)) %>% 
  left_join(select(.data = nasjonalt_arbeidssted, aar, Ein_En_Industri), by = c("aar")) %>% 
  mutate(andel = Eir_Er_Industri/Ein_En_Industri)


LQ_arb_El_Vann_Reno <- syssel_arb %>% 
  select(aar, knavn, Eir_Er_El_Vann_Reno) %>% 
  mutate(aar = as.character(aar)) %>% 
  left_join(select(.data = nasjonalt_arbeidssted, aar, Ein_En_El_Vann_Reno), by = c("aar")) %>% 
  mutate(andel = Eir_Er_El_Vann_Reno/Ein_En_El_Vann_Reno)


LQ_arb_Bygg_Anlegg <- syssel_arb %>% 
  select(aar, knavn, Eir_Er_Bygg_og_Anlegg) %>% 
  mutate(aar = as.character(aar)) %>% 
  left_join(select(.data = nasjonalt_arbeidssted, aar, Ein_En_Bygg_og_Anlegg), by = c("aar")) %>% 
  mutate(andel = Eir_Er_Bygg_og_Anlegg/Ein_En_Bygg_og_Anlegg)


LQ_arb_Finans <- syssel_arb %>% 
  select(aar, knavn, Eir_Er_Finans) %>% 
  mutate(aar = as.character(aar)) %>% 
  left_join(select(.data = nasjonalt_arbeidssted, aar, Ein_En_Finans), by = c("aar")) %>% 
  mutate(andel = Eir_Er_Finans/Ein_En_Finans)


LQ_arb_Undervisning <- syssel_arb %>% 
  select(aar, knavn, Eir_Er_Undervisning) %>% 
  mutate(aar = as.character(aar)) %>% 
  left_join(select(.data = nasjonalt_arbeidssted, aar, Ein_En_Undervisning), by = c("aar")) %>% 
  mutate(andel = Eir_Er_Undervisning/Ein_En_Undervisning)


LQ_arb_Helse <- syssel_arb %>% 
  select(aar, knavn, Eir_Er_Helse) %>% 
  mutate(aar = as.character(aar)) %>% 
  left_join(select(.data = nasjonalt_arbeidssted, aar, Ein_En_Helse), by = c("aar")) %>% 
  mutate(andel = Eir_Er_Helse/Ein_En_Helse)
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD =======
syssel_arb <- syssel_arb %>% 
  mutate(LQ_arb_Jordbruk = LQ_arb_Jordbruk$andel,
         LQ_arb_Industri = LQ_arb_Industri$andel,
         LQ_arb_El_Vann_Reno = LQ_arb_El_Vann_Reno$andel,
         LQ_arb_Bygg_Anlegg = LQ_arb_Bygg_Anlegg$andel,
         LQ_arb_Finans = LQ_arb_Finans$andel,
         LQ_arb_Undervisning = LQ_arb_Undervisning$andel,
         LQ_arb_Helse = LQ_arb_Helse$andel)
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD =======
LQ_arb <- syssel_arb %>% 
  select(aar, knavn, LQ_arb_Jordbruk, LQ_arb_Industri, LQ_arb_El_Vann_Reno, LQ_arb_Bygg_Anlegg, LQ_arb_Finans, LQ_arb_Undervisning, LQ_arb_Helse)
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e <<<<<<< HEAD =======
LQ_arb[is.na(LQ_arb)] = 0
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

Pendling

<<<<<<< HEAD

Pendling er et viktig begrep å bruke når vi snakker om regional utvikling. De ulike kommunene eller regionene kan ha ulike behov. Veldig mange kommuner har for lite arbeidsplasser i forhold til antall arbeidende innbyggere. Det vil si at de fleste er avhengige av å pendle til andre kommuner, også kalt utpendling. Det kan være andre kommuner i samme region eller andre regioner. Det finnes også begrepet netto innpendling som betyr at noen kommuner eller regioner har flere arbeidsplasser tilgjengelige enn de har innbyggere som kan jobbe innad i kommunen. Vi skal se på innpendling og utpendling som vil kunne fortelle oss i hvilken grad et sted er integrert i et større arbeidsmarked https://regionalanalyse.no/rapport/3004/1/4.

Vi har laget to ulike tabeller som tar for seg regionen Haugalandet og regionen Sunnhordland og Ullensvang, samt en tabell som tar for seg disse regionene samlet. Vi ønsker å skille disse to regionene for å se i hvilken kommune andelen av innpendling og utpendling er størst og minst.

Haugalandsregionen:

=======

De ulike kommunene og regionene har ulike behov, for at regionene skal utvikle seg er pendling et viktig begrep for å tiltrekke seg arbeidskraft. Veldig mange kommuner har for lite arbeidsplasser i forhold til antall arbeidende innbyggere, som vil si at de fleste er avhengige av pendlere. Pendling kan være til andre kommuner i samme region eller til andre regioner. Alle kommuner har kanskje ikke arbeidsplasser innen alle fagfelt, arbeidstakere er derfor avhengig av å pendler til andre kommuner for å finne relevant arbeid. Det samme gjelder dersom arbeidstaker har tilhørighet til en kommune, men det ikke finnes relevant arbeid da er han også nødt til å søke jobb i andre kommuner. Her kommer begrepene innpendling og utpendling inn, som betyr at noen kommuner eller regioner har flere arbeidsplasser tilgjengelige enn de har innbyggere som kan jobbe innad i kommunen eller at de ikke har nok arbeidsplasser og innbyggerene er nødt til å søke jobb andre plasser. Vi skal se på innpendling og utpendling som vil kunne fortelle oss i hvilken grad et sted er integrert i et større arbeidsmarked https://regionalanalyse.no/rapport/3004/1/4.

Nedenfor vil vi først ta for oss regionen Haugalandet og Sunnhordland med Ullensvang, og se på disse regionene hver for seg. Så kommer en tabell som tar for seg disse regionene samlet. Vi ønsker først å skille disse to regionene for å se i hvilken kommune andelen av innpendling og utpendling er størst og minst. For så å se på pendlingen mellom regionene.

Alle tabellene viser

Haugalandsregionen:

hgl_Pendling
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e

I tabellen over har vi sett på Haugalandsregionen og kommunene som er knyttet til denne regionen er Haugesund, Sauda, Bokn, Tysvær, Karmøy, Utsira og Vindafjord. Tabellen kan forklares på følgende måte:

I radene kan vi se innpendling. Her kan vi se en andel stillinger som er besatt av arbeidstakere fra andre kommuner i Haugalandsregionen.

I kolonnene ser vi utpendling. Det vil si arbeidstakere som bor i en kommune, og som har arbeidsted i en annen kommune innenfor Hauglandsregionen.

De som er markert med gult er arbeidstakere som bor og jobber i samme kommune.

Haugesund, Karmøy og Tysvær er de kommunene i regionen med høyest andel pendlere både når det gjelder inn- og utpendling. La oss se nærmere på Haugesund som har en stor del av arbeidstakerne i regionen. Det gjelder både når vi ser på innpendling, utpendling og de som bor og jobber i samme kommune. Ut ifra tabellen kan vi se at Haugesund har 11714 arbeidstakere som bor og jobber i kommunen. Fra Haugesund er det eksempelvis 1029 arbeidstakere som pendler til Tysvær og 2586 arbeidstakere som pendler til Karmøy. Til Sauda og Utsira er det en betydelig lavere andel som pendler. Grunnen til at det nok at det er mindre kommuner med færre arbeidsplasser. Mange av de som bor i distriktene som eksempelvis Sauda og Utsira jobber og bor i samme kommune. Vi kan se at i Sauda jobber og bor det 1789 arbeidstaker, mens de har 31 stykk som pendler inn til kommunen og 66 stykk som pendler ut av kommunen. Det kan være flere som pendler inn til og ut av kommunen fra andre regioner, men her ser vi tallene på de som pendler i Haugalandsregionen.

Vi vet at Haugesund er regionsentrum med sykehus og høgskole. Samtidig har Haugesund flere olje og sjøfartsnæringer. Det er sentralisert som betyr at det er grunnlag for et større jobbmarked. Det er årsaken til at Haugesund har mer innpendling enn de andre kommunene i regionen. Karmøy og Tysvær som ligger nærmest Haugesund har størst andel utpendling, også til Haugesund.

<<<<<<< HEAD
=======
sun_Pendling
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e
# Siste
<<<<<<< HEAD
LS0tCnRpdGxlOiAiQXJiZWlkc2tyYXYgdsOlcmVuIDIwMjIiCmF1dGhvcjoKLSBLZXZpbiBIYQotIE9sYSBBbmRyZSBPbG9mc3NvbgotIEFubiBFbGlzYWJldGggSmFjb2JzZW4KLSBIZWlkaSBNYXJpZSBSb2xmc25lcwotIERhbmllbCBLYXJzdGFkCi0gSGVucmlldHRlIEhhbnNlbgotIFN1c2FubiBCaXJrZWxhbmQgU2l2ZXJ0c2VuCi0gVmlsZGUgSGF1Z2xhbmQKc3VidGl0bGU6IE1TQjEwNiwgQW52ZW5kdCBieS0gb2cgcmVnaW9uYWzDuGtvbm9taQpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKbGFuZzogbm8tTkIKZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IHNlbnRlbmNlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShyZWFkcikKICBsaWJyYXJ5KGdncGxvdDIpCiAgbGlicmFyeShrbml0cikKICBsaWJyYXJ5KHZpcmlkaXMpCiAgbGlicmFyeSh0aWR5dmVyc2UpCiAgfSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIGluY2x1ZGUgPSBUUlVFKQpgYGAKCiMgUm9tbGlnZSBmb3Jza2plbGxlciBpIG7DpnJpbmdzc3RydWt0dXIsIHZpcmtuaW5nZXIgYXYgZWtzb2dlbmUgc2pva2sgaSBiYXNpc3N5c3NlbHNldHRpbmdlbiwgb2cgbG9rYWxlIGZvcnNramVsbGVyIEkgc3lzc2Vsc2V0dGluZ3N2ZWtzdC4KCkkgZGVubmUgb3BwZ2F2ZW4gdmlsIHZpIHNlIHDDpSBuw6ZyaW5nc3N0cnVrdHVyZXIgcMOlIEhhdWdhbGFuZGV0LCBTdW5uaG9yZGxhbmQgb2cgSGFyZGFuZ2VyLgoKUHJvYmxlbXN0aWxsaW5nZXIgb2cgYmVyZWduaW5nZXIgdmkgdmlsIHNlIG7DpnJtZXJlIHDDpQoKLSAgIEJlc2tyaXZlIHNpdHVhc2pvbmVuIHNsaWsgZGVuIGVyIGZvciAyMDIwLCBvZyBmb3IgdXR2aWtsaW5nZW4gb3ZlciB0aWQuCi0gICBTeXNzZWxzZXR0aW5nc3V0dmlrbGluZ2VuIGZvciB1bGlrZSBuw6ZyaW5nZXIgaSB1bGlrZSBrb21tdW5lciBvZyBmb3IgcmVnaW9uZW4gc2FtbGV0LgotICAgQW5kZWxlbiBhdiBzeXNzZWxzZXR0aW5nZW4gaW5uZW5mb3IgZW5rZWx0bsOmcmluZ2VyLCBvZyBzYW1tZW5saWduZSBzaXR1YXNqb25lbiBvZyB1dHZpa2xpbmdlbiBmb3IgbG9rYWxlIGtvbW11bmVyIG9nIGxva2FsIHJlZ2lvbiBtZWQgZGV0IHNvbSBnamVsZGVyIGZvciBuYXNqb25lbiBzYW1sZXQuCi0gICBCZXJlZ25lIGxva2FsaXNlcmluZ3Nrdm90aWVudGVyIGZvciB1bGlrZSBuw6ZyaW5nZXIgaSB1bGlrZSBrb21tdW5lciwgb2cgZm9yIHJlZ2lvbmVuKGUpIHNhbWxldC4KLSAgIEJlcmVnbmUgdWxpa2UgYWdncmVnZXJpbmdzbml2w6VlciBhdiBuw6ZyaW5nZXIgb2cgZ2VvZ3JhZmksIGlkZW50aWZpc2VyIG11bGlnZSBrbHluZ2VyIGJhc2VydCBww6UgdmVyZGllbmUgZm9yIGxva2FsaXNlcmluZ3Nrdm90aWVudGVuZS4KLSAgIEdqw7hyZSBlbiB2dXJkZXJpbmcgYXYgaHZvciBrb25zZW50cmVydC9zcHJlZHQgZW4gbsOmcmluZyBlciBmb3JkZWx0IG1lbGxvbSBrb21tdW5lbmUgaSByZWdpb25lbiwgYmFzZXJ0IHDDpSBiZXJlZ25pbmdlciBhdiBkZW4gcm9tbGlnZSBHaW5pLWluZGVrc2VuLgotICAgVnVyZGVyZSBvbSBzYW1tZW5saWduaW5nc2dydW5ubGFnZXQgYsO4ciB2w6ZyZSBzYW1sZXQgc3lzc2Vsc2V0dGluZyBpIHJlZ2lvbmVuLCBlbGxlciBzYW1sZXQgc3lzc2Vsc2V0dGluZyBhdiBuYXNqb25lbiwgb2cgZmlubmUgdXQgaHZpbGtlbiByb2xsZSBkZXQgc3BpbGxlciBvbSBlbiBicnVrZXIgcmVnaW9uYWxlIGVsbGVyIG5hc2pvbmFsZSBhbnNsYWcgZm9yIHNhbWxldCBzeXNzZWxzZXR0aW5nLgotICAgRmlubmUgdXQgb20gbsOmcmluZ3NzdHJ1a3R1cmVuIGkgcmVnaW9uZW4gaGFyIGJsaXR0IG1lciBlbGxlciBtaW5kcmUgZGl2ZXJzaWZpc2VydCwgbWFuZ2ZvbGRpZywgb3ZlciB0aWQuCi0gICBCZXJlZ25lIGVuIHJlZ2lvbmFsIG1hbmdmb2xkLWluZGVrcyBvZyBmaW5uZSB1dCBodm9yZGFuIHZlcmRpZW5lIHDDpSBlbiBzbGlrIGluZGVrcyBlciBlbmRyZXQgb3ZlciB0aWQuCi0gICBWdXJkZXJlIG9tIHN5c3NlbHNldHRpbmdzYW5kZWxlbmUgc2thbCBzYW1tZW5saWduZXMgbWVkIG5hc2pvbmFsZSBlbGxlciByZWdpb25hbGUgYW5kZWxlciBmb3IgZGUgdWxpa2UgbsOmcmluZ2VuZQotICAgR2plbnRhIGJlcmVnbmluZ2VyIGZvciBhbmRlbGVyIGF2IGFyYmVpZHN0YWtlcmUgaSB1bGlrZSBuw6ZyaW5nZXIsIGxva2FsaXNlcmluZ3Nrdm90aWVudGVyLCBkZW4gcm9tbGlnZSBHaW5pLSBrb2VmZmlzaWVudGVuIG9nIG3DpWxldCBmb3IgbWFuZ2ZvbGQgYXYgbsOmcmluZ2VyLCBtZWQgdXRnYW5nc3B1bmt0IGkgZGF0YSBzcGVzaWZpc2VydCBldHRlciBhcmJlaWRzdGFrZXJuZXMgYm9zdGVkLgotICAgU2FtbWVubGlnbmUgcmVzdWx0YXRlbmUgZm9yIGRhdGEgZXR0ZXIgYXJiZWlkc3N0ZWQsIG9nIGtvbW1lbnRlciBodmlsa2VuIGluZm9ybWFzam9uIHJlc3VsdGF0ZW5lIGdpciBvbSByb21saWcgbW9iaWxpdGV0IGkgYXJiZWlkc21hcmtlZGV0LgotICAgR2kgZW4ga29ydCBvdmVyc2lrdCBvdmVyIHBlbmRsZXJzdHLDuG1tZXIgbWVsbG9tIGtvbW11bmVuZSBpIHJlZ2lvbmVuCi0gICBCZXJlZ25lIG9nIHByZXNlbnRlcmUgYW5kZWxlciBhdiBhcmJlaWRzdGFrZXJlIG1lZCBib3N0ZWQgaSBlbiBrb21tdW5lIHNvbSBoYXIgYXJiZWlkc3N0ZWQgaSBhbmRyZSBrb21tdW5lciwgb2cgZ2rDuHIgZGV0IHNhbW1lIGZvciBhbmRlbGVuIGF2IGpvYmJlbmUgaSBlbiBrb21tdW5lIHNvbSBlciBiZXNhdHQgYXYgYXJiZWlkc3Rha2VyZSBmcmEgYW5kcmUga29tbXVuZXIuCi0gICBEaXNrdXRlcmUgZm9yc2tqZWxsZXIgbWVsbG9tIGtvbW11bmVuZSBpIHJlZ2lvbmVuLCBvZyBkcsO4ZnQgdXR2aWtsaW5nZW4gb3ZlciB0aWQgZm9yIHVsaWtlIGtvbW11bmVyCi0gICBCZXJlZ25lIG9nIHByZXNlbnRlcmUgYW5kZWxlbiBhdiBhcmJlaWRzdGFrZXJlIHNvbSBib3Igb2cgam9iYmVyIGlubmVuZm9yIHNhbW1lIGtvbW11bmUuIFNlIG9tIGRldCBlciBzeXN0ZW1hdGlza2UgZm9yc2tqZWxsZXIgc2V0dCBpIGZvcmhvbGQgdGlsIHNlbnRyYWxpdGV0IG9nIHRpbGdqZW5nZWxpZ2hldCBpIGRldCBsb2thbGUgYXJiZWlkc21hcmtlZGV0LiBPZyBvbSBkZXQgZXIgYmVzdGVtdGUgdHJlbmRlciBpIHV0dmlrbGluZ2VuIGZvciB1bGlrZSBrb21tdW5lci4KLSAgIEJydWtlIGJlcmVnbmluZ2VuZSBhdiBsb2thbGlzZXJpbmdrdm90aWVudGVyIHRpbCDDpSBkZWxlIG7DpnJpbmdlbmUgaW5uIGkgbG9rYWwtIG9nIGJhc2lzbsOmcmluZ2VyCi0gICBGb3JtdWxlcmUgZW4gw7hrb25vbWlzayBiYXNlbW9kZWxsIG9nIGJlcmVnbmUgw7hrb25vbWlza2UgYmFzZW11bGlwbGlrYXRvcmVyIGZvciBlbmtlbHRrb21tdW5lciBvZyByZWdpb24oZXIpLgotICAgVnVyZGVyZSBsb2thbGUgdmlya25pbmdlciBhdiBhbHRlcm5hdGl2ZSBsb2thbGlzZXJpbmdlciBpIE9kZGEsIEh1c25lcyBvZyBMZWlydmlrCi0gICBEcsO4ZnRlIHZpcmtuaW5nZXIgYXYgZXQgc2xpa3QgcG9zaXRpdnQgZWtzb2dlbnQgc2pva2sgZm9yIGRlbiBsb2thbGUgw7hrb25vbWllbiBnamVubm9tIGJydWsgYXYgZW4gYmFzZW1vZGVsbAotICAgRmlubmUgdXQgaHZvcmRhbiB2aXJrbmluZ2VuZSBldmVudHVlbHQgc3ByZXMgdGlsIGFuZHJlIGtvbW11bmVyIGkgcmVnaW9uZW4gb2cgaHZvcmRhbiBlbiBrYW4gYnJ1a2UgZGF0YSBmb3IgcGVuZGxlc3Ryw7htbWVyIHRpbCDDpSBwcmVkaWtlcmUgdmlya25pbmdlciBww6Ugc3lzc2Vsc2V0dGluZ2VuIGkgdWxpa2Uga29tbXVuZXIuCi0gICBTYW1tZW5saWduZSBkaXNzZSBwcmVkaWtzam9uZW5lIG1lZCBkZSB2aSBmw6VyIG7DpXIgdmkgZ2plbm5vbWbDuHJlciBhbmFseXNlbiBww6UgcmVnaW9uYWx0IG5pdsOlLgotICAgR2kgZW4gc2hpZnQtc2hhcmUgYW5hbHlzZSBpIGVuIGRpc2t1c2pvbiBhdiBmb3Jza2plbGxlciBpIHZla3N0IGZvciBla3NlbXBlbCBtZWxsb20gaW5kcmUsIG1pZHRyZSBvZyB5dHJlIGRlbGVyIGF2IHJlZ2lvbmVuLCBlbGxlciBldmVudHVlbHQgb21yw6VkZXIva29tbXVuZXIgc29tIGhhciBoYXR0IHN0ZXJrIG9nIHN2YWsgYmVmb2xrbmluZ3N1dHZpa2xpbmcuCgojIyBPdmVyc2lrdCBvdmVyIGJlZm9sa25pbmdlbmUgaSByZWdpb25lbmUKCiMjIyBIYXVnYWxhbmRldApIYXVnYWxhbmRldCBiZXN0w6VyIGF2IGtvbW11bmVuZSBCb2tuICg4NTIpLCBIYXVnZXN1bmQgKDM3MzU3KSwgS2FybcO4eSAoNDIxODYpLCBTYXVkYSAoNDU5NSksIFR5c3bDpnIoMTEwNjUpLCBVdHNpcmEoMTk4KSBvZyBWaW5kYWZqb3JkKDg3MTQpLiB0aWxzYW1tZW4gYm9yIGRldCAxMDQ5NjcgcGVyc29uZXIgaSBkZW5uZSByZWdpb25lbi4gaSB0aWRzcGVyaW9kZW4gdmkgaGFyIGhlbnRldCBpbm4gZGF0YSBoYXIgZGV0IHZlcnQga29tbXVuZXNhbW1lbnNsw6VpbmcgaSBkZW5uZSByZWdpb25lbi4gRGEgYmxlIMOYbGVuIG9nIHZpbmRhZmpvcmQgc2zDpXR0IGkgc2FtbWVuIHRpbCBlbiBrb21tdW5lIChodm9yZGFuIGhhciB2aSB0YXR0IGhlbnN5biB0aWwgZGV0dGU/Pz8pCgojIyMgU3VubmhvcmRsYW5kIG9nIFVsbGVuc3ZhbmcKU3VubmhvcmRsYW5kIG9nIFVsbGVuc3ZhbmcgYmVzdMOlciBhdiBrb21tdW5lbmUgQsO4bWxvKDExOTU3KSwgRXRuZSg0MDYyKSwgRml0amFyKDMxODkpLCBLdmlubmhlcmFkKDEzMDcxKSwgU3RvcmQoMTg3NTkpLCBTdmVpbyg1NzY2KSwgVHlzbmVzKDI4NjkpIG9nIFVsbGVuc3ZhbmcoMTEwNDgpLiBUaWxzYW1tZW4gYm9yIGRldCA3MDcyMSBwZXJzb25lciBpIGRlbm5lIHJlZ2lvbmVuLgoKVGFsbGVuZSBlciBoZW50ZXQgZnJhIFNTQiAwOS4wMS4yMSAoaHR0cHM6Ly93d3cuc3NiLm5vL3N0YXRiYW5rL3RhYmxlLzAxMjIzL3RhYmxlVmlld0xheW91dDEvKSBnamVsZGVyIGZvciA0IGt2YXJ0YWwgMjAyMC4KCmBgYHtyIGNzdl9maWxlcn0Kc3lzc2VsX2FyYiA8LSByZWFkX2NzdigiRGF0YS9zeXNzZWxfYXJiLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmhsZF9hcmIgPC0gcmVhZF9jc3YoIkRhdGEvaGxkX2FyYi5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpzdW5fYXJiIDwtIHJlYWRfY3N2KCJEYXRhL3N1bl9hcmIuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKaGFyX2FyYiA8LSByZWFkX2NzdigiRGF0YS9oYXJfYXJiLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCnN5c3NlbF9ib3MgPC0gcmVhZF9jc3YoIkRhdGEvc3lzc2VsX2Jvcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpobGRfYm9zIDwtIHJlYWRfY3N2KCJEYXRhL2hsZF9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKc3VuX2JvcyA8LSByZWFkX2NzdigiRGF0YS9zdW5fYm9zLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmhhcl9ib3MgPC0gcmVhZF9jc3YoIkRhdGEvaGFyX2Jvcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpQZW5kbGluZyA8LSByZWFkX2NzdigiRGF0YS9QZW5kbGluZy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpoZ2xfUGVuZGxpbmcgPC0gcmVhZF9jc3YoIkRhdGEvaGdsX1BlbmRsaW5nLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCnN1bl9QZW5kbGluZyA8LSByZWFkX2NzdigiRGF0YS9zdW5fUGVuZGxpbmcuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKYGBgCgojIDEgU3lzc2Vsc2V0dGluZyBpIHVsaWtlIG7DpnJpbmdlciwgZXR0ZXIgYXJiZWlkc3N0ZWQKCiMjIEhhdWdhbGFuZGV0CgpGw7hyc3RlIHJlZ2lvbmVuIHZpIHZlbGdlciDDpSBzZSBww6UgZXIgSGF1Z2FsYW5kZXQuIEhlciDDuG5za2VyIHZpIMOlIHNlIHDDpSB1dHZpa2xpbmdlbiBmcmEgMjAwOCB0aWwgMjAyMCwgYXYgYW50YWxsIGFuc2F0dGUgaSBzaW4gaGVsaGV0IGkgcmVnaW9uZW4sIHNhbXQgZGUgNiBtZXN0IHJlbGV2YW50ZSBuw6ZyaW5nZW5lLgoKYGBge3IgQXJiZWlkc3N0ZWRfSGF1Z2FsYW5kZXRfMX0KaGxkX2FyYiAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiRmlnLiAxOiBIYXVnYWxhbmRldCIpKwogIHlsYWIoIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKQpgYGAKCkkgMjAyMCBlciBkZXQgaSB1bmRlcmthbnQgYXYgNTAgMDAwIGFuc2F0dGUgaSBhbGxlIG7DpnJpbmdlciBww6UgSGF1Z2FsYW5kZXQuIEF2IEZpZy4gMSBzZXIgdmkgYXQgSGF1Z2FsYW5kZXQgZmlrayBlbiBuZWRnYW5nIGkgYW50YWxsIGFuc2F0dGUgaSAyMDE1IG9nIDIwMTYuIEkgMjAxNyBvZyAyMDE4IGJsZSBkZXQgdmVrc3QsIGZyZW0gdGlsIGRldCBzbnVkZGUgaSAyMDE5IGlnamVuLgoKYGBge3IgQXJiZWlkc3N0ZWRfSGF1Z2FsYW5kZXRfMn0Kc3lzc2VsX2FyYiAlPiUgCiAgZmlsdGVyKGtuciAlaW4lIGMoMTEwNiwgMTEzNSwgMTE0NSwgMTE0NiwgMTE0OSwgMTE1MSwgMTE2MCkpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCwgKGFuZ2xlPTApKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGxhYnModGl0bGUgPSAiRmlnLiAyOiBIYXVnYWxhbmRldCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCkkgRmlnLiAyIHNlciB2aSBhdCBmbGVyZSBhdiBrb21tdW5lbmUgcMOlIEhhdWdhbGFuZGV0IGhhciBoYXR0IGxpdGVuIGFyYmVpZHNwbGFzc3Zla3N0LCBtZWQgdW5udGFrIGF2IFR5c3bDpnIsIFZpbmRhZmpvcmQgb2cgS2FybcO4eSBpIGRlbiBzaXN0ZSB0acOlcnNwZXJpb2Rlbi4gVmkgc2VyIGRldHRlIG1lciB0eWRlbGlnIHDDpSBmaWcuIDMgb2cgNC4KCmBgYHtyIGhsZF9hcmJfbG9uZ30KaGxkX2FyYl9sb25nIDwtIHN5c3NlbF9hcmIgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhdWdhbGFuZGV0XzNfU3TDuHJzdGVfQXJiZWlkc3RlZH0KaGxkX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJIYXVnZXN1bmQiLCAiS2FybcO4eSIsICJWaW5kYWZqb3JkIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDM6IEhhdWdhbGFuZGV0OiBIYXVnZXN1bmQsIEthcm3DuHkgb2cgVmluZGFmam9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfSGF1Z2FsYW5kZXRfNF9NaW5zdGVfQXJiZWlkc3RlZH0KaGxkX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCb2tuIiwgIlNhdWRhIiwgIlR5c3bDpnIiLCAiVXRzaXJhIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDQ6IEhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSBUeXN2w6ZyIG9nIFV0c2lyYSIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCkZpZ3VyIDMgb2cgNCB2aXNlciB1dHZpa2xpbmdlbiBhdiBkZXQgdG90YWxlIGFudGFsbCBhbnNhdHRlIGkgYWxsZSBuw6ZyaW5nZXIgcMOlIGtvbW11bmFsdCBuaXbDpSwgaW5uZW5mb3IgSGF1Z2FsYW5kLXJlZ2lvbmVuLgoKSSBkaXNzZSBmaWd1cmVuZSwgc8OlIHNlciB2aSB0eWRlbGlnIGF0IEhhdWdlc3VuZCBoYXIgaGF0dCByZWR1a3Nqb24gaSBhbnRhbGwgYW5zYXR0ZSB0b3RhbHQgc2V0dCwgbWVucyBLYXJtw7h5LCBWaW5kYWZqb3JkIG9nIFR5c3bDpnIgaGFyIGhhdHQgZW4gbWFya2FudCB2ZWtzdCBkZSBzaXN0ZSB0aSDDpXJlbmUuIFNpZGVuIEhhdWdlc3VuZCBoYXIgZmxlc3QgYXJiZWlkc3BsYXNzZXIgYmV0eXIgdXR2aWtsaW5nZW4gaSBIYXVnZXN1bmQgbXllIGZvciBkZSBzYW1sZWRlIHRhbGxlbmUuCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfM19TdMO4cnN0ZV9BcmJlaWRzc3RlZH0KaGxkX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJIYXVnZXN1bmQiLCAiS2FybcO4eSIsICJWaW5kYWZqb3JkIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gNTogSGF1Z2FsYW5kZXQ6IEhhdWdlc3VuZCwgS2FybcO4eSBvZyBWaW5kYWZqb3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXVnZWxhbmRldF80X01pbnN0ZV9BcmJlaWRzc3RlZH0KaGxkX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCb2tuIiwgIlNhdWRhIiwgIlR5c3bDpnIiLCAiVXRzaXJhIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gNjogSGF1Z2FsYW5kZXQ6IEJva24sIFNhdWRhLCBUeXN2w6ZyIG9nIFV0c2lyYSIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpGaWd1ciA1IG9nIDYgdmlzZXIgdXR2aWtsaW5nZW4gYXYgZGUgNiBtZXN0IHJlbGV2YW50ZSBuw6ZyaW5nZW5lIGkgSGF1Z2FsYW5kc3JlZ2lvbmVuIHDDpSBrb21tdW5lIG5pdsOlLgoKVmkgc2VyIGkgZGUgdHJlIHN0w7hyc3RlIGtvbW11bmVuZSwgSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFZpbmRhZmpvcmQgdXRnasO4ciBuw6ZyaW5nZW5lIEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIgb2cgSW5kdXN0cmkgZGUgc3TDuHJzdGUuIEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIgaGFyIHZva3N0IGpldm50IG9nIHRydXR0IGRlIHNpc3RlIHRpw6VyZW5lLCBtZW5zIGFudGFsbCBhbnNhdHRlIGkgaW5kdXN0cmluw6ZyaW5nZW4gaGFyIHZhcmllcnQgZnJhIGtvbW11bmUgdGlsIGtvbW11bmUuIEkgSGF1Z2FsYW5kZXQgdXRnasO4ciBwcmltw6ZybsOmcmluZ2VyIChqb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UpIGVuIHN0w7hycmUgYW5kZWwsIGVubiBob3MgS2FybcO4eSBvZyBIYXVnZXN1bmQgaHZvciBwcmltw6ZybsOmcmluZ2VuZSBrdW4gdXRnasO4cmUgZW4gbGl0ZW4gYW5kZWwuCgojIyMgU3lzc2Vsc2V0dGluZ3N1dHZpa2xpbmdlbiBmb3IgdWxpa2UgbsOmcmluZ2VyIGkgdWxpa2Uga29tbXVuZXIgb2cgZm9yIHJlZ2lvbmVuIHNhbWxldC4gCgpEZXQgZXIgcmVsYXRpdnQgc3RvcmUga29tbXVuZXZpc2UgZm9yc2tqZWxsZXIgaSBuw6ZyaW5nc3N0cnVrdHVyZW4uClJvZ2FsYW5kIGhhciBlbiBmb3Job2xkc3ZpcyBlbnNpZGlnIG7DpnJpbmdzc3RydWt0dXIsIG9samUgb2cgZ2FzcyBlciBkb21pbmVyZW5kZS4gRnlsa2V0IGVyIHN1dmVyZW50IGRvbWluZXJlbmRlIGZvciBmb3NzaWwgZW5lcmdpLiBEZSBoYXIgZm9yIMO4dnJpZyBkZSBzaXN0ZSDDpXJlbmUgc2F0c2V0IHDDpSBldCBlbiBtZXIgZGlmZmVyZW5zaWVydCBuw6ZyaW5nc3N0cnVrdHVyIG9nIG7DpnJpbmdzbGl2IHZlZCDDpSBzYXRzZSBww6UgaGVsc2UsIElLVCBvZyBmb3JueWJhciBlbmVyZ2kuCgpJIHbDpXJlIG1vZGVsbGVyLCBlciBzYXRzaW5nZW4gcMOlIGhlbHNlIGRlbiBtZXN0IHR5ZGVsaWdlLiBBdiByZW50IHRla25pc2tlIGdydW5uZXIgZXIgZGV0IHZhbnNrZWxpZyDDpSBzZSB1dHZpa2xpbmdlbiBpIGVua2VsdGUgbsOmcmluZ2VyIHNvbSB1dGdqw7hyIHNtw6UgYW5kZWxlciwgcMOlIGdydW5uIGF2IHNrYWxhZW4gc29tIGVyIGJlbnl0dGV0LiBUaWwgdHJvc3MgZm9yIGRldHRlLCBrYW4gbWFuIHNlIGF0IG7DpnJpbmdzc3RydWt0dXJlbiBpIHJlZ2lvbmVuIHNhbWxldCBnZW5lcmVsdCBzZXR0IGhhciBlbmRyZXQgc2VnIGxpdGUuCgpSb2dhbGFuZCBoYXIgZ29kZSBqb3JkYnJ1a3NtdWxpZ2hldGVyLCBtZW4gaSBGaWcuIDI6IEhhdWdhbGFuZGV0IHNlciB2aSBlbiBuZWRnYW5nIGkgc3lzc2Vsc2V0dGluZ2VuIGRlIHNpc3RlIHRpw6VyZW5lLCBtZW5zIGRldCBlciBlbiBtYXJnaW5hbCDDuGtuaW5nIGkgU3VubmhvcmRhbGFuZCwgamYuIEZpZyA5LiBJIEZpZy4gMTI6IHNlciB2aSBhdCBUeXNuZXMgaGFyIGhhdHQgZW4gbWFya2FudCDDuGtuaW5nIGkgcHJpbcOmcm7DpnJpbmdlbiwgcmVsYXRpdnQgc2V0dC4KClVuaXZlcnNpdGV0cy0gb2cgaMO4Z3Nrb2xlc2VrdG9yZW4gZXIgbGl0ZW4gaSBSb2dhbGFuZCwgb2cgZGVuIGJlc3TDpXIgZm9yIGRldCBmw7hyc3RlIGF2IFVuaXZlcnNpdGV0ZXQgaSBTdGF2YW5nZXIgKFVpUykgb2cgSMO4Z3NrdWxlbiBww6UgVmVzdGxhbmRldCAoSFZMKSBtZWQgY2FtcHVzIEhhdWdlc3VuZC4KCkhhdWdhbGFuZCBWZWtzdCwgc29tIGVyIGVpZ2QvZHJldmV0IGF2IEhhdWdhbGFuZHNyZWdpb25lbiBlciBpIHNwaXNzZW4gcMOlIMOlIGxlZ2dlIHRpbCByZXR0ZSBmb3Igw6UgZXRhYmxlcmUgbnkgaW5kdXN0cmkgc2FtdCBhbmRyZSBhcmJlaWRzcGxhc3NlciBpIHJlZ2lvbmVuLgoKSSBoZWxzZXNla3RvcmVuIGVyIFN0YXZhbmdlciB1bml2ZXJzaXRldHNzeWtlaHVzIChTdVMpIHNlbnRyYWx0LgoKIyMgU3VubmhvcmRsYW5kCgpWaWRlcmUgw7huc2tlciB2aSDDpSBzZSBww6UgZGVuIHNhbW1lIHV0dmlrbGluZ2VuLCBtZW4gZGVubmUgZ2FuZ2VuIGkgU3VubmhvcmRsYW5kc3JlZ2lvbmVuLgoKYGBge3IgQXJiZWlkc3N0ZWRfU3VubmhvcmRsYW5kXzF9CnN1bl9hcmIgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gNzogU3VubmhvcmRhbGFuZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKSGVyIHZpc2VyIGZpZ3VyIDcgdXR2aWtsaW5nZW4gdGlsIGRlbiB0b3RhbGUgc3VtbWVuIGF2IGFuc2F0dGUgaSBTdW5uaG9yZGxhbmRzcmVnaW9uZW4gZnJhIDIwMDggdGlsIDIwMjAuIFN1bm5ob3JkYWxhbmQgaGFyIGkgMjAyMCBpIHVuZGVya2FudCBhdiAyNSA1MDAgYW5zYXR0ZS4gVmkgc2VyIHV0IGlmcsOlIGZpZ3VyZW4gYXQgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIGhhZGRlIGVpbiBtYXJrYW50IHZla3N0IGlmcsOlIDIwMDggdGlsIDIwMTQgbWVkIHBlcmlvZGFyIG1lZCBzdmFrIG5lZGdhbmcuIEZyYSAyMDE0IGhhciBkZXQgdsOmcnQgZW4gcmVkdWtzam9uIGkgdG90YWx0IGFudGFsbCBhbnNhdHRlLgoKYGBge3IgQXJiZWlkc3N0ZWRfU3VubmhvcmRsYW5kXzJ9CnN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSBjKDQ2MTEsIDQ2MTIsIDQ2MTMsIDQ2MTQsIDQ2MTUsIDQ2MTYsIDQ2MTcpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgIGxhYnModGl0bGUgPSAiRmlnLiA4OiBTdW5uaG9yZGxhbmQiLCB4ID0gIsOFciIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpGaWd1ciA4IHZpc2VyIHV0dmlrbGluZ2VuIGF2IHRvdGFsdCBhbnNhdHRlIGkgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIHDDpSBrb21tdW5lbml2w6UgaSBoZWxlIHJlZ2lvbmVuIGZyYSAyMDA4IHRpbCAyMDIwLiBEZW5uZSBmaWd1cmVuIGdpciBvc3MgZW4gb3ZlcnNpa3QsIG1lbiBlciBpa2tlIGhlaWx0IGJydWtlcnZlbm5lbGlnLiBWaSBsYWdlciBkZXJtZWQgZW4gbWVyIG92ZXJzaWt0bGlnIGZpZ3VyLCBqZi4gZmlndXIgOSAmIDEwLgoKYGBge3Igc3VuX2FyYl9sb25nfQpzdW5fYXJiX2xvbmcgPC0gc3lzc2VsX2FyYiAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYEFsbGUgTsOmcmluZ2VyYDpVb3BwZ2l0dCwKICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLAogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzNfU3TDuHJzdGVfQXJiZWlkc3RlZH0Kc3VuX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiS3Zpbm5oZXJhZCIsICJTdG9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiA5OiBTdW5uaG9yZGxhbmQ6IELDuG1sbywgS3Zpbm5oZXJhZCBvZyBTdG9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzRfTWluc3RlX0FyYmVpZHN0ZWR9CnN1bl9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiRXRuZSIsICJGaXRqYXIiLCAiU3ZlaW8iLCAiVHlzbmVzIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDEwOiBTdW5uaG9yZGxhbmQ6IEV0bmUsIEZpdGhhciwgU3ZlaW8gb2cgVHlzbmVzIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAyKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCmBgYAoKVmkgc2VyIGhlciB1dCBpZnJhIGZpZ3VyIDkgb2cgMTAgdXR2aWtsaW5nZW4gZm9yIGh2ZXIgZW5rZWx0IGtvbW11bmUgaSBTdW5uaG9yZGxhbmQgdG90YWx0IHNldHQsIG9nIGhlciBzZXIgdmkgbXllIHR5ZGxpZ2VyZSB1dHZpa2xpbmdlbiBmcmEgMjAwOCB0aWwgMjAyMC4gRW4ga2FuIHNlIGhlciBhdCBLdmlubmhlcmFkLCBFdG5lIG9nIEZpdGphciBoYXIgaGF0dCBlbiByZWR1a3Nqb24gaSB0b3RhbHQgYW5zYXR0ZSwgbWVucyBUeXNuZXMgb2cgU3ZlaW8gaGFyIGhhdHQgZWluIGtyYWZ0aWcgdmVrc3QuIEVuIGludGVyZXNzYW50IGJlbWVya2luZyBlciBTdG9yZCBpIDIwMTQgb2cgS3Zpbm5oZXJhZCBmcmEgMjAwOCB0aWwgMjAxNy4KCkZvciDDpSBmw6UgZXQgYmVkcmUgb3ZlcnNpa3Qgb3ZlciB1dHZpa2xpbmdlbiBpIGtvbW11bmVuIMO4bnNrZXIgdmkgw6Ugc2UgcMOlIGRlIDYgbWVzdCByZWxldmFudGUgbsOmcmluZ2VuZSBpIGh2ZXIga29tbXVuZS4KCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfM19TdMO4cnN0ZV9BcmJlaWRzc3RlZH0Kc3VuX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiU3RvcmQiLCAiS3Zpbm5oZXJhZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDExOiBTdW5uaG9yZGxhbmQ6IELDuG1sbywgS3Zpbm5oZXJhZCBvZyBTdG9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfNF9NaW5zdGVfQXJiZWlkc3N0ZWR9CnN1bl9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiRXRuZSIsICJTdmVpbyIsICJGaXRqYXIiLCAiVHlzbmVzIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMTI6IFN1bm5ob3JkbGFuZDogRXRuZSwgRml0amFyLCBTdmVpbyBvZyBUeXNuZXMiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKRmlndXIgMTEgb2cgMTIgdmlzZXIgZGUgNiBtZXN0IHJlbGV2YW50ZSBuw6ZyaW5nZW5lIGkgaHZlciBlbmtlbHQga29tbXVuZSBpIFN1bm5ob3JkbGFuZHNyZWdpb25lbiBmcmEgMjAwOCB0aWwgMjAyMC4KCkVuIHNlciB1dCBpZnJhIGZpZ3VyIDExIGF0IGkgZGUgdHJlIHN0w7hyc3RlIGtvbW11bmVuZSwgKkLDuG1sbyosICpLdmlubmhlcmFkKiBvZyAqU3RvcmQqIHPDpSBoYXIgZGUgYWxsZSBoYXR0IGVuIHJlZHVrc2pvbiBpIGluZHVzdHJpZW4sIHNhbXRpZGlnIHNvbSBkZSBoYXIgaGF0dCBlbiB2ZWtzdCBpIGhlbHNlLSBvZyBzb3NpYWx0amVuZXN0ZXIuIFR5c25lcyBoYXIgdsOmcnQgc3RhYmlsIG7DpXIgZGV0IGtvbW1lciB0aWwgaW5kdXN0cmksIG1lbiBoYXIgc2V0dCBlaW4gbWFya2FudCB2ZWtzdCBpIHByaW3DpnJuw6ZyaW5nZW4gKEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZSkuCgojIyMgU3lzc2Vsc2V0dGluZ3N1dHZpa2xpbmdlbiBmb3IgdWxpa2UgbsOmcmluZ2VyIGkgdWxpa2Uga29tbXVuZXIgb2cgZm9yIHJlZ2lvbmVuIHNhbWxldC4KCkRldCBmw7hyc3RlIGJlbWVya2Vsc2VzdmVyZGlnZSBpIFN1bm5ob3JkbGFuZHNyZWdpb25lbiBlciBkZW4gbWFya2FudGUgcmVkdWtzam9uZW4gaSBpbmR1c3RyaSBpIFN0b3JkIGtvbW11bmUgaSAyMDE0LCBzYW10IEt2aW5uaGVyYWQgZnJhIDIwMDguIERldHRlIHN0ZW1tZXIgb3ZlcmVucyBtZWQgdG8gaGVuZGVsc2VyLiBEZW4gZsO4cnN0ZSBlciBvbGpla25la2tlbiBpIDIwMTQgc29tIG1lZGbDuHJ0ZSBhdCBibC5hLiBBa2VyIFN0b3JkIEFTIHNvbSBlciBhdmhlbmdpZyBhdiBPbGplLWluZHVzdHJpZW4gbcOldHRlIHBlcm1pdGVyZS4KClN0b3JkIGVyIGVuIGtvbW11bmUgc29tIGhhciBteWUgb2Zmc2hvcmUgaW5kdXN0cmkuIEkgMjAwOC8yMDA5IHPDpSBzdGVuZ3RlIFPDuHItTm9yZ2UgQWx1bWluaXVtICJCLUhhbGxlbiIgc29tIG1lZGbDuHJ0ZSA1MCUgcmVkdWtzam9uIGkgcHJvZHVrc2pvbiwgb2cgZGVybWVkIGFuc2F0dGUuIEludGVyZXNzYW50IMOlIGJlbWVya2UgYXQgaSBLdmlubmhlcmFkIHPDpSBlciBhbnRhbGwgaW5kdXN0cmlhcmJlaWRlcmUgcmVkdXNlcnQgc2FtdGlkaWcgc29tIGFudGFsbCBhbnNhdHRlIGkgSGVsc2UtIG9nIFNvc2lhbGV0amVuZXN0ZXIgw7hrdC4gQsO4bWxvIGhhciBvZ3PDpSBzZXR0IGVuIHN0YWJpbCByZWR1a3Nqb24gaSBhbnNhdHRlIGlubmVuIGluZHVzdHJpLCBzYW10IHZla3N0IGkgSGVsc2UtIG9nIFNvc2lhbGV0amVuZXN0ZXIgZnJlbSB0aWwgMjAxOC4KClNlciBlbiBww6UgaGVsZSBTdW5uaG9yZGxhbmRzcmVnaW9uZW4gaSBzaW4gaGVsaGV0LCBzw6Ugc2VyIHZpIGVuIHN2w6ZydCB0eWRlbGlnIHZla3N0IGlubmVuIEhlbHNlLSBvZyBTb3NpYWxldGplbmVzdGVyLCBvZyByZWR1a3Nqb24gaW5uZW4gaW5kdXN0cmkgaSBoZWxlIHJlZ2lvbmVuLiBLdmlubmhlcmFkLCBUeXNuZXMgb2cgRml0amFyIGhhciBvcHBsZXZkIGVpbiBtYXJrYW50IHZla3N0IGlubmVuIHByaW3DpnJuw6ZyaW5nLiAqKkthbiBkZXQgdmVyZSBlaW4gZ3J1bm4gdGlsIGRldHRlIHNvbSBidXJkZSBkaXNrdXRlcmFzdD8/KioKCiMgRm9ydHNldHQgSGVyIChPQSwgS0gpCgojIyBIYXJkYW5nZXIKClRpbCBzbHV0dCBtw6UgdmkgZ2plcmUgZGV0IHNhbW1lIG1lZCAqSGFyZGFuZ2VyKgoKSSBoZW5ob2xkIHRpbCBvcHBnYXZlbnMga3JhdiB0aWwgYmV0cmFrdGVyIHZpICpIYXJkYW5nZXIqIGbDuHIgMjAxOSBzb20gVWxsZW5zdmFuZy0gb2cgT2RkYSBrb21tdW5lIHNvbSB0byBzZXBhcmVydGUga29tbXVuZXIuIGkgMjAyMCBzw6UgYmxlIFVsbGVuc3ZhbmcsIE9kZGEgb2cgSm9uZGFsIHNsw6V0dCBzYW1tZW4gdGlsIFVsbGVuc3ZhbmcuIERldHRlIGZvcmtsYXJlciBkZW4gdm9sZHNvbW1lIMO4a25pbmdlbiBpIHN5c3NlbHNldHRpbmcgaSByZWdpb25lbiB2ZWQgdGlkc3B1bmt0ZXQgZm9yIGtvbW11bmVzYW1tZW5zbMOlaW5nLgoKYGBge3IgQXJiZWlkc3N0ZWRfSGFyZGFuZ2VyXzF9Cmhhcl9hcmIgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMTM6IEhhcmRhbmdlciIsIHk9ICJBbGxlIE7DpnJpbmdlciIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDIpKQpgYGAKCmBgYHtyIEFyYmVpZHNzdGVkX0hhcmRhbmdlcl8yfQpzeXNzZWxfYXJiICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYyg0NjE4LCAxMjI4KSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIkZpZy4gMTQ6IEhhcmRhbmdlciIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIGhhcl9hcmJfbG9uZ30KaGFyX2FyYl9sb25nIDwtIHN5c3NlbF9hcmIgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhcmRhbmdlcl9BcmJlaWRzdGVkfQpoYXJfYXJiX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIk9kZGEiLCAiVWxsZW5zdmFuZyIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAxNTogSGFyZGFuZ2VyOiBPZGRhIG9nIFVsbGVuc3ZhbmciLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhcmRhbmdlcl9BcmJlaWRzc3RlZH0KaGFyX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJPZGRhIiwgIlVsbGVuc3ZhbmciKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAxNjogSGFyZGFuZ2VyOiBPZGRhLCBVbGxlbnN2YW5nIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKVWxsZW5zdmFuZyBrb21tdW5lIGhhciBzdG9yIGtyYWZ0cHJvZHVrc2pvbiBvZyBob3ZlZG7DpnJpbmdlbiBlciBpbmR1c3RyaS4gTWFqb3JpdGV0ZW4gYXYga3JhZnRwcm9kdWtzam9uZW4gZm9yZWfDpXIgaSB0aWRsaWdlcmUgT2RkYS4gT2RkYSBlciBldCBlbnNpZGlnIGluZHVzdHJpc3RlZCwgbWVuIGhhciBvZ3PDpSBlbiBtYXJpdGltIG7DpnJpbmcgaSB0aWxsZWdnLiBJIGZpZ3VyIDE2IHNlciB2aSBhdCBpbmR1c3RyaW7DpnJpbmdlbiB1dGdqw7hyIGVuIGJldHJha3RlbGlnIHN0w7hycmUgYW5kZWwgYXYgc3lzc2Vsc2V0dGluZ2VuIGkgaGVyLiBJbmR1c3RyaW7DpnJpbmdlbiBlciBvZ3PDpSBvbWZhdHRldCBvZyBieWdnLSBvZyBhbmxlZ2dzdmlya3NvbWhldC4gUMOlIG1vdHNhdHQgc2lkZSBlciBqb3JkYnJ1aywgaGVsc2UtIG9nIHNvc2lhbHRqZW5lc3RlciBkb21pbmVyZW5kZSBpIFVsbGVuc3ZhbmcuIAoKKipHZW5lcmVsdCBvbSBVbGxlbnN2YW5nIGtvbW11bmUqKgoKVWxsZW5zdmFuZyBrb21tdW5lIChtZWQgT2RkYSkgaGFyIGhhdHQgZW4gamV2biBvZyBuZWdhdGl2IGJlZm9sa25pbmdzdmVrc3QgaSBtYW5nZSB0acOlci4gRGV0IGdqZW5zcGVpbGVzIGlra2UgdHlkZWxpZyBpIHbDpXJlIG1vZGVsbGVyIHDDpSBncnVubiBhdiBza2FsYWVuIHNvbSBlciBicnVrdC4gSSB0aWxsZWdnIGhhciB2aSBpa2tlIGhlbnN5bnRhdHQgaW5udmFuZHJlbmRlIGFyYmVpZGVyZSwgZWxsZXIgbWlkbGVydGlkaWdlIGZyYWZseXR0ZWRlIHNvbSBmb3IgZWtzZW1wZWwgc3R1ZGVudGVyLgoKIyAyIAoKRmlubmVyIGxva2FsaXNlcmluZ3Nrdm90aWVudGVyIGZvciB1bGlrZSBuw6ZyaW5nZXIgaSB1bGlrZSBrb21tdW5lciwgb2cgZm9yIHJlZ2lvbmVuIHNhbWxldAoKYGBge3J9CiNvcmRuZXIgZXR0ZXIga29tbXVuZW5hdm4gb2cgw6VyCnRtcCA8LSBzeXNzZWxfYm9zCmBgYAoKCmBgYHtyfQpoYXUyMCA8LSBzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoYWFyID09ICIyMDIwIiwga25hdm4gPT0gIkhhdWdlc3VuZCIpCmBgYAoKYGBge3J9CihoYXUyMCRJbmR1c3RyaS9oYXUyMCRgQWxsZSBOw6ZyaW5nZXJgKQoxOTA1LzE4MTM3CmBgYAoKYGBge3J9CnN5c3NlbF9ib3MgPC0gc3lzc2VsX2JvcyAlPiUgCiAgbXV0YXRlKEVpcl9Fcl9pbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9Kb3JkYnJ1ayA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KHJlYWR4bCkKbmFzam9uYWx0X2Jvc3RlZCA8LSByZWFkX2V4Y2VsKCJEYXRhL25hc2pvbmFsdF9ib3N0ZWQueGxzeCIpCmBgYAoKYGBge3J9Cm5hc2pvbmFsdF9ib3N0ZWQgPC0gbmFzam9uYWx0X2Jvc3RlZCAlPiUgCiAgbXV0YXRlKEVpbl9Fbl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpbl9Fbl9Kb3JkYnJ1ayA9IGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpbl9Fbl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWluX0VuX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMgRm9yZWzDpXIgw6UgdsOmcmUgbGl0dCBtZXIgZm9yc2lrdGlnIGhlci4gc3lzc2VsX2JvcyRFaXJfRXJfaW5kdXN0cmkgaGFyIGxlbmdkZSAyMDcKIyAxMyoxNSArIDEyIChkZW4gc2lzdGUgT2RkYSkuIG5hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX0luZHVzdHJpIGhhciBsZW5nZGUgMTMKIyBLb2RlbiBoZXIgZm9ydXRzZXR0ZXIgYXQgbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSW5kdXN0cmkga2FuIHJlcGxpa2VyZXMgMTYKIyBnYW5nZXIuIFJpc2t5IGkgdXRnYW5nc3B1bmt0ZXQgb2cgaGVyIGfDpXIgZGV0IGdhbHQgcGdhLiBPZGRhIG1lZCAxMiBvYnMuCiMgTWVkZsO4cmVyIGF0IHJlc3VsdGF0ZXQgYmxpciBnYWx0IGV0dGVyIE9kZGEuIEZvcmVzbMOlciDDpSB0YSBkZXQgbWVyIHN0ZWd2aXMgc2xpayBhdAojIGVuIGdhciBtZXIga29udHJvbGwKCkxRaW5kdXN0cmkgPC0gc3lzc2VsX2JvcyAlPiUgCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9pbmR1c3RyaSkgJT4lIAogIG11dGF0ZShhYXIgPSBhcy5jaGFyYWN0ZXIoYWFyKSkgJT4lIAogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYm9zdGVkLCBhYXIsIEVpbl9Fbl9JbmR1c3RyaSksIGJ5ID0gYygiYWFyIikpICU+JSAKICBtdXRhdGUoCiAgYW5kZWwgPSBFaXJfRXJfaW5kdXN0cmkvRWluX0VuX0luZHVzdHJpCiAgKQoKIyBEaXNzZSBtw6UgZmlrc2VzIHDDpSB0aWxzdmFyZW5kZSB2aXMuIEhhciBmZWlsIHZlcmRpZXIgc2xpayBkZSBlciBuw6UgCkxRam9yZGJydWsgPC0gYXNfdGliYmxlKHN5c3NlbF9ib3MkRWlyX0VyX0pvcmRicnVrL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX0pvcmRicnVrKQpMUXVuZGVydmlzbmluZyA8LSBhc190aWJibGUoc3lzc2VsX2JvcyRFaXJfRXJfVW5kZXJ2aXNuaW5nL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX1VuZGVydmlzbmluZykKTFFoZWxzZSA8LSBhc190aWJibGUoc3lzc2VsX2JvcyRFaXJfRXJfSGVsc2UvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSGVsc2UpCmBgYAoKYGBge3J9CnN5c3NlbF9ib3MgPC0gc3lzc2VsX2JvcyAlPiUgCiAgbXV0YXRlKExRaW5kdXN0cmkgPSBMUWluZHVzdHJpJGFuZGVsLAogICAgICAgICBMUWpvcmRicnVrID0gTFFqb3JkYnJ1aywKICAgICAgICAgTFF1bmRlcnZpc25pbmcgPSBMUXVuZGVydmlzbmluZywKICAgICAgICAgTFFoZWxzZSA9IExRaGVsc2UpCmBgYAoKCmBgYHtyfQpMUWJvcyA8LSBzeXNzZWxfYm9zICU+JSAKICBzZWxlY3QoYWFyLCBrbmF2biwgTFFpbmR1c3RyaSwgTFFqb3JkYnJ1aywgTFF1bmRlcnZpc25pbmcsIExRaGVsc2UpCmBgYAoKRm9yIHJlZ2lvbiBIYXVnYWxhbmQ6CgpgYGB7cn0KaGxkX2Jvc19MUSA8LSBobGRfYm9zICU+JSAKICBtdXRhdGUoRWlyX0VyX2luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkKYGBgCgpgYGB7cn0KTFFpbmR1c3RyaV9obGQgPC0gYXNfdGliYmxlKGhsZF9ib3NfTFEkRWlyX0VyX2luZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX0luZHVzdHJpKQpMUWpvcmRicnVrX2hsZCA8LSBhc190aWJibGUoaGxkX2Jvc19MUSRFaXJfRXJfSm9yZGJydWsvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSm9yZGJydWspCkxRdW5kZXJ2aXNuaW5nX2hsZCA8LSBhc190aWJibGUoaGxkX2Jvc19MUSRFaXJfRXJfVW5kZXJ2aXNuaW5nL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX1VuZGVydmlzbmluZykKTFFoZWxzZV9obGQgPC0gYXNfdGliYmxlKGhsZF9ib3NfTFEkRWlyX0VyX0hlbHNlL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX0hlbHNlKQpgYGAKCmBgYHtyfQpobGRfYm9zX0xRIDwtIGhsZF9ib3NfTFEgJT4lIAogIG11dGF0ZShMUWluZHVzdHJpID0gTFFpbmR1c3RyaV9obGQkdmFsdWUsCiAgICAgICAgIExRam9yZGJydWsgPSBMUWpvcmRicnVrX2hsZCR2YWx1ZSwKICAgICAgICAgTFF1bmRlcnZpc25pbmcgPSBMUXVuZGVydmlzbmluZ19obGQkdmFsdWUsCiAgICAgICAgIExRaGVsc2UgPSBMUWhlbHNlX2hsZCR2YWx1ZSkgJT4lIAogIHNlbGVjdCjDhXIsIExRaW5kdXN0cmksIExRam9yZGJydWssIExRdW5kZXJ2aXNuaW5nLCBMUWhlbHNlKQpgYGAKCkZvciBTdW5uaG9yZGFsYW5kOgoKYGBge3J9CnN1bl9ib3NfTFEgPC0gc3VuX2JvcyAlPiUgCiAgbXV0YXRlKEVpcl9Fcl9pbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9Kb3JkYnJ1ayA9IGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApCmBgYAoKYGBge3J9CkxRaW5kdXN0cmlfc3VuIDwtIGFzX3RpYmJsZShzdW5fYm9zX0xRJEVpcl9Fcl9pbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9JbmR1c3RyaSkKTFFqb3JkYnJ1a19zdW4gPC0gYXNfdGliYmxlKHN1bl9ib3NfTFEkRWlyX0VyX0pvcmRicnVrL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX0pvcmRicnVrKQpMUXVuZGVydmlzbmluZ19zdW4gPC0gYXNfdGliYmxlKHN1bl9ib3NfTFEkRWlyX0VyX1VuZGVydmlzbmluZy9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9VbmRlcnZpc25pbmcpCkxRaGVsc2Vfc3VuIDwtIGFzX3RpYmJsZShzdW5fYm9zX0xRJEVpcl9Fcl9IZWxzZS9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9IZWxzZSkKYGBgCgpgYGB7cn0Kc3VuX2Jvc19MUSA8LSBzdW5fYm9zX0xRICU+JSAKICBtdXRhdGUoTFFpbmR1c3RyaSA9IExRaW5kdXN0cmlfc3VuJHZhbHVlLAogICAgICAgICBMUWpvcmRicnVrID0gTFFqb3JkYnJ1a19zdW4kdmFsdWUsCiAgICAgICAgIExRdW5kZXJ2aXNuaW5nID0gTFF1bmRlcnZpc25pbmdfc3VuJHZhbHVlLAogICAgICAgICBMUWhlbHNlID0gTFFoZWxzZV9zdW4kdmFsdWUpICU+JSAKICBzZWxlY3Qow4VyLCBMUWluZHVzdHJpLCBMUWpvcmRicnVrLCBMUXVuZGVydmlzbmluZywgTFFoZWxzZSkKYGBgCgpGb3IgSGFyZGFuZ2VyOgoKYGBge3J9Cmhhcl9ib3NfTFEgPC0gaGFyX2JvcyAlPiUgCiAgbXV0YXRlKEVpcl9Fcl9pbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9Kb3JkYnJ1ayA9IGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApCmBgYAoKYGBge3J9CkxRaW5kdXN0cmlfaGFyIDwtIGFzX3RpYmJsZShoYXJfYm9zX0xRJEVpcl9Fcl9pbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9JbmR1c3RyaSkKTFFqb3JkYnJ1a19oYXIgPC0gYXNfdGliYmxlKGhhcl9ib3NfTFEkRWlyX0VyX0pvcmRicnVrL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX0pvcmRicnVrKQpMUXVuZGVydmlzbmluZ19oYXIgPC0gYXNfdGliYmxlKGhhcl9ib3NfTFEkRWlyX0VyX1VuZGVydmlzbmluZy9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9VbmRlcnZpc25pbmcpCkxRaGVsc2VfaGFyIDwtIGFzX3RpYmJsZShoYXJfYm9zX0xRJEVpcl9Fcl9IZWxzZS9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9IZWxzZSkKYGBgCgpgYGB7cn0KaGFyX2Jvc19MUSA8LSBoYXJfYm9zX0xRICU+JSAKICBtdXRhdGUoTFFpbmR1c3RyaSA9IExRaW5kdXN0cmlfaGFyJHZhbHVlLAogICAgICAgICBMUWpvcmRicnVrID0gTFFqb3JkYnJ1a19oYXIkdmFsdWUsCiAgICAgICAgIExRdW5kZXJ2aXNuaW5nID0gTFF1bmRlcnZpc25pbmdfaGFyJHZhbHVlLAogICAgICAgICBMUWhlbHNlID0gTFFoZWxzZV9obGQkdmFsdWUpICU+JSAKICBzZWxlY3Qow4VyLCBMUWluZHVzdHJpLCBMUWpvcmRicnVrLCBMUXVuZGVydmlzbmluZywgTFFoZWxzZSkKYGBgCgoKIyAzIFN5c3NlbHNldHRpbmcgaSB1bGlrZSBuw6ZyaW5nZXIsIGV0dGVyIGJvc3RlZCAoTW9kZWxsZXIgdW5kZXIgYXJiZWlkKQoKIyMgSGF1Z2FsYW5kZXQKCmBgYHtyIEJvc3RlZF9IYXVnYWxhbmRldF8xfQpobGRfYm9zICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gw4VyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJIYXVnYWxhbmRldCIpKwogIHlsYWIoIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKQpgYGAKCmBgYHtyIEJvc3RlZF9IYXVnYWxhbmRldF8yfQpzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYygxMTA2LCAxMTM1LCAxMTQ1LCAxMTQ2LCAxMTQ5LCAxMTUxLCAxMTYwKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBgQWxsZSBOw6ZyaW5nZXJgLCAoYW5nbGU9MCkpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgbGFicyh0aXRsZSA9ICJIYXVnYWxhbmRldCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIGhsZF9ib3NfbG9uZ30KaGxkX2Jvc19sb25nIDwtIHN5c3NlbF9ib3MgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhdWdhbGFuZGV0XzNfU3TDuHJzdGVfQm9zdGVkfQpobGRfYm9zX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIkhhdWdlc3VuZCIsICJLYXJtw7h5IiwgIlZpbmRhZmpvcmQiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4geDogSGF1Z2FsYW5kZXQ6IEhhdWdlc3VuZCwgS2FybcO4eSBvZyBWaW5kYWZqb3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfSGF1Z2FsYW5kZXRfNF9NaW5zdGVfQm9zdGVkfQpobGRfYm9zX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIkJva24iLCAiU2F1ZGEiLCAiVHlzdsOmciIsICJVdHNpcmEiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4geDogSGF1Z2FsYW5kZXQ6IEJva24sIFNhdWRhIFR5c3bDpnIgb2cgVXRzaXJhIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXVnZWxhbmRldF8zX1N0w7hyc3RlX0Jvc3RlZH0KaGxkX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJIYXVnZXN1bmQiLCAiS2FybcO4eSIsICJWaW5kYWZqb3JkIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0OiBIYXVnZXN1bmQsIEthcm3DuHkgb2cgVmluZGFmam9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfNF9NaW5zdGVfQm9zdGVkfQpobGRfYm9zX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIkJva24iLCAiU2F1ZGEiLCAiVHlzdsOmciIsICJVdHNpcmEiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQ6IEJva24sIFNhdWRhLCBUeXN2w6ZyIG9nIFV0c2lyYSIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgojIyBTdW5uaG9yZGxhbmQKCmBgYHtyIEJvc3RlZF9TdW5uaG9yZGxhbmRfMX0Kc3VuX2JvcyAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiU3VubmhvcmRhbGFuZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKYGBge3IgQm9zdGVkX1N1bm5ob3JkbGFuZF8yfQpzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYyg0NjExLCA0NjEyLCA0NjEzLCA0NjE0LCA0NjE1LCA0NjE2LCA0NjE3KSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZCIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIHN1bl9ib3NfbG9uZ30Kc3VuX2Jvc19sb25nIDwtIHN5c3NlbF9ib3MgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX1N1bm5ob3JkbGFuZF8zX1N0w7hyc3RlX0Jvc3RlZH0Kc3VuX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiS3Zpbm5oZXJhZCIsICJTdG9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiB4OiBTdW5uaG9yZGxhbmQ6IELDuG1sbywgS3Zpbm5oZXJhZCBvZyBTdG9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX1N1bm5ob3JkbGFuZF80X01pbnN0ZV9Cb3N0ZWR9CnN1bl9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiRXRuZSIsICJGaXRqYXIiLCAiU3ZlaW8iLCAiVHlzbmVzIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIHg6IFN1bm5ob3JkbGFuZDogRXRuZSwgRml0aGFyLCBTdmVpbyBvZyBUeXNuZXMiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX1N1bm5ob3JkbGFuZF8zX1N0w7hyc3RlX0Jvc3RlZH0Kc3VuX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiU3RvcmQiLCAiS3Zpbm5oZXJhZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJTdW5uaG9yZGxhbmQ6IELDuG1sbywgS3Zpbm5oZXJhZCBvZyBTdG9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfU3VubmhvcmRsYW5kXzRfTWluc3RlX0Jvc3RlZH0Kc3VuX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJFdG5lIiwgIlN2ZWlvIiwgIkZpdGphciIsICJUeXNuZXMiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiU3VubmhvcmRsYW5kOiBFdG5lLCBGaXRqYXIsIFN2ZWlvIG9nIFR5c25lcyIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgojIyBIYXJkYW5nZXIKCmBgYHtyIEJvc3RlZF9IYXJkYW5nZXJfMX0KaGFyX2JvcyAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiSGFyZGFuZ2VyIiwgeT0gIkFsbGUgTsOmcmluZ2VyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKYGBge3IgQm9zdGVkX0hhcmRhbmdlcl8yfQpzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYyg0NjE4LCAxMjI4KSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIkhhcmRhbmdlciIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIGhhcl9ib3NfbG9uZ30KaGFyX2Jvc19sb25nIDwtIHN5c3NlbF9ib3MgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhcmRhbmdlcl9Cb3N0ZWR9Cmhhcl9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiT2RkYSIsICJVbGxlbnN2YW5nIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIHg6IEhhcmRhbmdlcjogT2RkYSBvZyBVbGxlbnN2YW5nIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXJkYW5nZXJfQm9zdGVkfQpoYXJfYm9zX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIk9kZGEiLCAiVWxsZW5zdmFuZyIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXI6IE9kZGEsIFVsbGVuc3ZhbmciLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKIyAzLjEgTG9rYWxpc2VyaW5nc2t2b3RpZW50ZXIKCmBgYHtyfQpsaWJyYXJ5KHJlYWR4bCkKbmFzam9uYWx0X2FyYmVpZHNzdGVkIDwtIHJlYWRfZXhjZWwoIkRhdGEvbmFzam9uYWx0X2FyYmVpZHNzdGVkLnhsc3giKQpgYGAKCiMjIExva2FsaXNlcmluZ3Nrdm90aWVudGVyIGZvciByZWdpb25lbmUgc2FtbGV0IChNw6UgdGlsIGxpdHQgbWVpciBhcmJlaWQgZW5kbykKCiMjIyMgU3BsaXR0aW5nPwoKKipNw6Uga2Fuc2tqZSBmaW5uZSB1dCBvbSB2aSBza2FsIGRlbGUgb3BwIGkgMiwgc2xpayBhdCB2aSBmw6VyIGhlaWxlIGRhdGFzZXR0ZXQgbsOlciB2aSBicnVrZXIgcHJpbnQoKSoqCgojIyMgSGF1Z2FsYW5kZXQgMjAwOC0yMDIwCgotIEVpcl9Fcl9Kb3JkYnJ1ayA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGkgcmVnaW9uIEhhdWdhbGFuZGV0Ci0gRWlyX0VyX0luZHVzdHJpID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gSW5kdXN0cmktc2VrdG9yZW4gaSByZWdpb24gSGF1Z2FsYW5kZXQKLSBFaXJfRXJfRWxfVmFubl9SZW5vID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRWxla2V0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uLXNla3RvcmVuIGkgcmVnaW9uIEhhdWdhbGFuZGV0Ci0gRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0LXNla3RvcmVuIGkgcmVnaW9uIEhhdWdhbGFuZGV0Ci0gRWlyX0VyX0ZpbmFucyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nLXNla3RvcmVuIGkgcmVnaW9uIEhhdWdhbGFuZGV0Ci0gRWlyX0VyX1VuZGVydmlzbmluZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIFVuZGVydmlzbmluZy1zZWt0b3JlbiBpIHJlZ2lvbiBIYXVnYWxhbmRldAotIEVpcl9Fcl9IZWxzZSA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXItc2VrdG9yZW4gaSByZWdpb24gSGF1Z2FsYW5kZXQKCmBgYHtyIGhsZF9pbmR1c3RyaX0KaGxkX2FyYl9MUSA8LSBobGRfYXJiICU+JSAKICAjIFNsaWsgZmlubmVyIHZpIHNhbWxldCBzeXNzZWxzZXR0aW5nIGkgSW5kdXN0cmkgaSBIYXVnZWxhbmRldCBmb3Igw6VyIDIwMDgtMjAyMAogIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkgJT4lIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Kb3JkYnJ1aywgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfRWxfVmFubl9SZW5vLCBFaXJfRXJfQnlnZ19vZ19BbmxlZ2csIEVpcl9Fcl9GaW5hbnMsIEVpcl9Fcl9VbmRlcnZpc25pbmcsIEVpcl9Fcl9IZWxzZSkKYGBgCgojIyMgU3VubmhvcmRsYW5kIDIwMDgtMjAyMAoKLSBFaXJfRXJfSm9yZGJydWsgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSBFaXJfRXJfSW5kdXN0cmkgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBJbmR1c3RyaS1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSBFaXJfRXJfRWxfVmFubl9SZW5vID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRWxla2V0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uLXNla3RvcmVuIGkgcmVnaW9uIFN1bm5ob3JkbGFuZAotIEVpcl9Fcl9CeWdnX29nX0FubGVnZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldC1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSBFaXJfRXJfRmluYW5zID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRmluYW5zaWVyaW5nIG9nIEZvcnNpa3Jpbmctc2VrdG9yZW4gaSByZWdpb24gU3VubmhvcmRsYW5kCi0gRWlyX0VyX1VuZGVydmlzbmluZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIFVuZGVydmlzbmluZy1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSBFaXJfRXJfSGVsc2UgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyLXNla3RvcmVuIGkgcmVnaW9uIFN1bm5ob3JkbGFuZAoKYGBge3Igc3VuX2luZHVzdHJpfQpzdW5fYXJiX0xRIDwtIHN1bl9hcmIgJT4lIAogICMgU2xpayBmaW5uZXIgdmkgc2FtbGV0IHN5c3NlbHNldHRpbmcgaSBJbmR1c3RyaSBpIFN1bm5ob3JkbGFuZCBmb3Igw6VyIDIwMDgtMjAyMAogIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkKYGBgCgojIyMgSGFyZGFuZ2VyIDIwMDgtMjAyMAoKLSBFaXJfRXJfSm9yZGJydWsgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpIHJlZ2lvbiBIYXJkYW5nZXIKLSBFaXJfRXJfSW5kdXN0cmkgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBJbmR1c3RyaS1zZWt0b3JlbiBpIHJlZ2lvbiBIYXJkYW5nZXIKLSBFaXJfRXJfRWxfVmFubl9SZW5vID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRWxla2V0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uLXNla3RvcmVuIGkgcmVnaW9uIEhhcmRhbmdlcgotIEVpcl9Fcl9CeWdnX29nX0FubGVnZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldC1zZWt0b3JlbiBpIHJlZ2lvbiBIYXJkYW5nZXIKLSBFaXJfRXJfRmluYW5zID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRmluYW5zaWVyaW5nIG9nIEZvcnNpa3Jpbmctc2VrdG9yZW4gaSByZWdpb24gSGFyZGFuZ2VyCi0gRWlyX0VyX1VuZGVydmlzbmluZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIFVuZGVydmlzbmluZy1zZWt0b3JlbiBpIHJlZ2lvbiBIYXJkYW5nZXIKLSBFaXJfRXJfSGVsc2UgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyLXNla3RvcmVuIGkgcmVnaW9uIEhhcmRhbmdlcgoKYGBge3IgaGFyX2luZHVzdHJpfQpoYXJfYXJiX0xRIDwtIGhhcl9hcmIgJT4lIAogICMgU2xpayBmaW5uZXIgdmkgc2FtbGV0IHN5c3NlbHNldHRpbmcgaSBJbmR1c3RyaSBpIEhhcmRhbmdlciBmb3Igw6VyIDIwMDgtMjAyMAogIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkKYGBgCgojIyBOYXNqb25hbHQ/PwoKYGBge3J9CnN5c3NlbF9hcmIgPC0gc3lzc2VsX2FyYiAlPiUgCiAgbXV0YXRlKEVpcl9Fcl9Kb3JkYnJ1ayA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9FbF9WYW5uX1Jlbm8gPSBgRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb25gL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9CeWdnX29nX0FubGVnZyA9IGBCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXRgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9GaW5hbnMgPSBgRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmdgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApCmBgYAoKYGBge3J9Cm5hc2pvbmFsdF9hcmJlaWRzc3RlZCA8LSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQgJT4lIAogIG11dGF0ZShFaW5fRW5fSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaW5fRW5fSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaW5fRW5fRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaW5fRW5fQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0YC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaW5fRW5fRmluYW5zID0gYEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaW5fRW5fVW5kZXJ2aXNuaW5nID0gVW5kZXJ2aXNuaW5nL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpbl9Fbl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgKQoKCkxRX2FyYl9Kb3JkYnJ1ayA8LSBzeXNzZWxfYXJiICU+JSAKICBzZWxlY3QoYWFyLCBrbmF2biwgRWlyX0VyX0pvcmRicnVrKSAlPiUgCiAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgCiAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCwgYWFyLCBFaW5fRW5fSm9yZGJydWspLCBieSA9IGMoImFhciIpKSAlPiUgCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX0pvcmRicnVrL0Vpbl9Fbl9Kb3JkYnJ1aykKCgpMUV9hcmJfSW5kdXN0cmkgPC0gc3lzc2VsX2FyYiAlPiUgCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9JbmR1c3RyaSkgJT4lIAogIG11dGF0ZShhYXIgPSBhcy5jaGFyYWN0ZXIoYWFyKSkgJT4lIAogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0luZHVzdHJpKSwgYnkgPSBjKCJhYXIiKSkgJT4lIAogIG11dGF0ZShhbmRlbCA9IEVpcl9Fcl9JbmR1c3RyaS9FaW5fRW5fSW5kdXN0cmkpCgoKTFFfYXJiX0VsX1Zhbm5fUmVubyA8LSBzeXNzZWxfYXJiICU+JSAKICBzZWxlY3QoYWFyLCBrbmF2biwgRWlyX0VyX0VsX1Zhbm5fUmVubykgJT4lIAogIG11dGF0ZShhYXIgPSBhcy5jaGFyYWN0ZXIoYWFyKSkgJT4lIAogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0VsX1Zhbm5fUmVubyksIGJ5ID0gYygiYWFyIikpICU+JSAKICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfRWxfVmFubl9SZW5vL0Vpbl9Fbl9FbF9WYW5uX1Jlbm8pCgoKTFFfYXJiX0J5Z2dfQW5sZWdnIDwtIHN5c3NlbF9hcmIgJT4lIAogIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cpICU+JSAKICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSAKICBsZWZ0X2pvaW4oc2VsZWN0KC5kYXRhID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkLCBhYXIsIEVpbl9Fbl9CeWdnX29nX0FubGVnZyksIGJ5ID0gYygiYWFyIikpICU+JSAKICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cvRWluX0VuX0J5Z2dfb2dfQW5sZWdnKQoKCkxRX2FyYl9GaW5hbnMgPC0gc3lzc2VsX2FyYiAlPiUgCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9GaW5hbnMpICU+JSAKICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSAKICBsZWZ0X2pvaW4oc2VsZWN0KC5kYXRhID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkLCBhYXIsIEVpbl9Fbl9GaW5hbnMpLCBieSA9IGMoImFhciIpKSAlPiUgCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX0ZpbmFucy9FaW5fRW5fRmluYW5zKQoKCkxRX2FyYl9VbmRlcnZpc25pbmcgPC0gc3lzc2VsX2FyYiAlPiUgCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9VbmRlcnZpc25pbmcpICU+JSAKICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSAKICBsZWZ0X2pvaW4oc2VsZWN0KC5kYXRhID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkLCBhYXIsIEVpbl9Fbl9VbmRlcnZpc25pbmcpLCBieSA9IGMoImFhciIpKSAlPiUgCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX1VuZGVydmlzbmluZy9FaW5fRW5fVW5kZXJ2aXNuaW5nKQoKCkxRX2FyYl9IZWxzZSA8LSBzeXNzZWxfYXJiICU+JSAKICBzZWxlY3QoYWFyLCBrbmF2biwgRWlyX0VyX0hlbHNlKSAlPiUgCiAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgCiAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCwgYWFyLCBFaW5fRW5fSGVsc2UpLCBieSA9IGMoImFhciIpKSAlPiUgCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX0hlbHNlL0Vpbl9Fbl9IZWxzZSkKYGBgCgpgYGB7cn0Kc3lzc2VsX2FyYiA8LSBzeXNzZWxfYXJiICU+JSAKICBtdXRhdGUoTFFfYXJiX0pvcmRicnVrID0gTFFfYXJiX0pvcmRicnVrJGFuZGVsLAogICAgICAgICBMUV9hcmJfSW5kdXN0cmkgPSBMUV9hcmJfSW5kdXN0cmkkYW5kZWwsCiAgICAgICAgIExRX2FyYl9FbF9WYW5uX1Jlbm8gPSBMUV9hcmJfRWxfVmFubl9SZW5vJGFuZGVsLAogICAgICAgICBMUV9hcmJfQnlnZ19BbmxlZ2cgPSBMUV9hcmJfQnlnZ19BbmxlZ2ckYW5kZWwsCiAgICAgICAgIExRX2FyYl9GaW5hbnMgPSBMUV9hcmJfRmluYW5zJGFuZGVsLAogICAgICAgICBMUV9hcmJfVW5kZXJ2aXNuaW5nID0gTFFfYXJiX1VuZGVydmlzbmluZyRhbmRlbCwKICAgICAgICAgTFFfYXJiX0hlbHNlID0gTFFfYXJiX0hlbHNlJGFuZGVsKQpgYGAKCmBgYHtyfQpMUV9hcmIgPC0gc3lzc2VsX2FyYiAlPiUgCiAgc2VsZWN0KGFhciwga25hdm4sIExRX2FyYl9Kb3JkYnJ1aywgTFFfYXJiX0luZHVzdHJpLCBMUV9hcmJfRWxfVmFubl9SZW5vLCBMUV9hcmJfQnlnZ19BbmxlZ2csIExRX2FyYl9GaW5hbnMsIExRX2FyYl9VbmRlcnZpc25pbmcsIExRX2FyYl9IZWxzZSkKYGBgCgpgYGB7cn0KTFFfYXJiW2lzLm5hKExRX2FyYildID0gMApgYGAKCiMgUGVuZGxpbmcKClBlbmRsaW5nIGVyIGV0IHZpa3RpZyBiZWdyZXAgw6UgYnJ1a2UgbsOlciB2aSBzbmFra2VyIG9tIHJlZ2lvbmFsIHV0dmlrbGluZy4gRGUgdWxpa2Uga29tbXVuZW5lIGVsbGVyIHJlZ2lvbmVuZSBrYW4gaGEgdWxpa2UgYmVob3YuIFZlbGRpZyBtYW5nZSBrb21tdW5lciBoYXIgZm9yIGxpdGUgYXJiZWlkc3BsYXNzZXIgaSBmb3Job2xkIHRpbCBhbnRhbGwgYXJiZWlkZW5kZSBpbm5ieWdnZXJlLiBEZXQgdmlsIHNpIGF0IGRlIGZsZXN0ZSBlciBhdmhlbmdpZ2UgYXYgw6UgcGVuZGxlIHRpbCBhbmRyZSBrb21tdW5lciwgb2dzw6Uga2FsdCB1dHBlbmRsaW5nLiBEZXQga2FuIHbDpnJlIGFuZHJlIGtvbW11bmVyIGkgc2FtbWUgcmVnaW9uIGVsbGVyIGFuZHJlIHJlZ2lvbmVyLiBEZXQgZmlubmVzIG9nc8OlIGJlZ3JlcGV0IG5ldHRvIGlubnBlbmRsaW5nIHNvbSBiZXR5ciBhdCBub2VuIGtvbW11bmVyIGVsbGVyIHJlZ2lvbmVyIGhhciBmbGVyZSBhcmJlaWRzcGxhc3NlciB0aWxnamVuZ2VsaWdlIGVubiBkZSBoYXIgaW5uYnlnZ2VyZSBzb20ga2FuIGpvYmJlIGlubmFkIGkga29tbXVuZW4uIFZpIHNrYWwgc2UgcMOlIGlubnBlbmRsaW5nIG9nIHV0cGVuZGxpbmcgc29tIHZpbCBrdW5uZSBmb3J0ZWxsZSBvc3MgaSBodmlsa2VuIGdyYWQgZXQgc3RlZCBlciBpbnRlZ3JlcnQgaSBldCBzdMO4cnJlIGFyYmVpZHNtYXJrZWQgaHR0cHM6Ly9yZWdpb25hbGFuYWx5c2Uubm8vcmFwcG9ydC8zMDA0LzEvNC4gIAoKVmkgaGFyIGxhZ2V0IHRvIHVsaWtlIHRhYmVsbGVyIHNvbSB0YXIgZm9yIHNlZyByZWdpb25lbiBIYXVnYWxhbmRldCBvZyByZWdpb25lbiBTdW5uaG9yZGxhbmQgb2cgVWxsZW5zdmFuZywgc2FtdCBlbiB0YWJlbGwgc29tIHRhciBmb3Igc2VnIGRpc3NlIHJlZ2lvbmVuZSBzYW1sZXQuIFZpIMO4bnNrZXIgw6Ugc2tpbGxlIGRpc3NlIHRvIHJlZ2lvbmVuZSBmb3Igw6Ugc2UgaSBodmlsa2VuIGtvbW11bmUgYW5kZWxlbiBhdiBpbm5wZW5kbGluZyBvZyB1dHBlbmRsaW5nIGVyIHN0w7hyc3Qgb2cgbWluc3QuIAoKSGF1Z2FsYW5kc3JlZ2lvbmVuOiAKCmBgYHtyIFBlbmRsaW5nIHDDpSBIYXVnYWxhbmRldH0KaGdsX1BlbmRsaW5nCmBgYApJIHRhYmVsbGVuIG92ZXIgaGFyIHZpIHNldHQgcMOlIEhhdWdhbGFuZHNyZWdpb25lbiBvZyBrb21tdW5lbmUgc29tIGVyIGtueXR0ZXQgdGlsIGRlbm5lIHJlZ2lvbmVuIGVyIEhhdWdlc3VuZCwgU2F1ZGEsIEJva24sIFR5c3bDpnIsIEthcm3DuHksIFV0c2lyYSBvZyBWaW5kYWZqb3JkLiBUYWJlbGxlbiBrYW4gZm9ya2xhcmVzIHDDpSBmw7hsZ2VuZGUgbcOldGU6ICAKCkkgcmFkZW5lIGthbiB2aSBzZSBpbm5wZW5kbGluZy4gSGVyIGthbiB2aSBzZSBlbiBhbmRlbCBzdGlsbGluZ2VyIHNvbSBlciBiZXNhdHQgYXYgYXJiZWlkc3Rha2VyZSBmcmEgYW5kcmUga29tbXVuZXIgaSBIYXVnYWxhbmRzcmVnaW9uZW4uICAKCkkga29sb25uZW5lIHNlciB2aSB1dHBlbmRsaW5nLiBEZXQgdmlsIHNpIGFyYmVpZHN0YWtlcmUgc29tIGJvciBpIGVuIGtvbW11bmUsIG9nIHNvbSBoYXIgYXJiZWlkc3RlZCBpIGVuIGFubmVuIGtvbW11bmUgaW5uZW5mb3IgSGF1Z2xhbmRzcmVnaW9uZW4uICAKCkRlIHNvbSBlciBtYXJrZXJ0IG1lZCBndWx0IGVyIGFyYmVpZHN0YWtlcmUgc29tIGJvciBvZyBqb2JiZXIgaSBzYW1tZSBrb21tdW5lLiAKCkhhdWdlc3VuZCwgS2FybcO4eSBvZyBUeXN2w6ZyIGVyIGRlIGtvbW11bmVuZSBpIHJlZ2lvbmVuIG1lZCBow7h5ZXN0IGFuZGVsIHBlbmRsZXJlIGLDpWRlIG7DpXIgZGV0IGdqZWxkZXIgaW5uLSBvZyB1dHBlbmRsaW5nLiBMYSBvc3Mgc2UgbsOmcm1lcmUgcMOlIEhhdWdlc3VuZCBzb20gaGFyIGVuIHN0b3IgZGVsIGF2IGFyYmVpZHN0YWtlcm5lIGkgcmVnaW9uZW4uIERldCBnamVsZGVyIGLDpWRlIG7DpXIgdmkgc2VyIHDDpSBpbm5wZW5kbGluZywgdXRwZW5kbGluZyBvZyBkZSBzb20gYm9yIG9nIGpvYmJlciBpIHNhbW1lIGtvbW11bmUuIFV0IGlmcmEgdGFiZWxsZW4ga2FuIHZpIHNlIGF0IEhhdWdlc3VuZCBoYXIgMTE3MTQgYXJiZWlkc3Rha2VyZSBzb20gYm9yIG9nIGpvYmJlciBpIGtvbW11bmVuLiBGcmEgSGF1Z2VzdW5kIGVyIGRldCBla3NlbXBlbHZpcyAxMDI5IGFyYmVpZHN0YWtlcmUgc29tIHBlbmRsZXIgdGlsIFR5c3bDpnIgb2cgMjU4NiBhcmJlaWRzdGFrZXJlIHNvbSBwZW5kbGVyIHRpbCBLYXJtw7h5LiBUaWwgU2F1ZGEgb2cgVXRzaXJhIGVyIGRldCBlbiBiZXR5ZGVsaWcgbGF2ZXJlIGFuZGVsIHNvbSBwZW5kbGVyLiBHcnVubmVuIHRpbCBhdCBkZXQgbm9rIGF0IGRldCBlciBtaW5kcmUga29tbXVuZXIgbWVkIGbDpnJyZSBhcmJlaWRzcGxhc3Nlci4gTWFuZ2UgYXYgZGUgc29tIGJvciBpIGRpc3RyaWt0ZW5lIHNvbSBla3NlbXBlbHZpcyBTYXVkYSBvZyBVdHNpcmEgam9iYmVyIG9nIGJvciBpIHNhbW1lIGtvbW11bmUuIFZpIGthbiBzZSBhdCBpIFNhdWRhIGpvYmJlciBvZyBib3IgZGV0IDE3ODkgYXJiZWlkc3Rha2VyLCBtZW5zIGRlIGhhciAzMSBzdHlrayBzb20gcGVuZGxlciBpbm4gdGlsIGtvbW11bmVuIG9nIDY2IHN0eWtrIHNvbSBwZW5kbGVyIHV0IGF2IGtvbW11bmVuLiBEZXQga2FuIHbDpnJlIGZsZXJlIHNvbSBwZW5kbGVyIGlubiB0aWwgb2cgdXQgYXYga29tbXVuZW4gZnJhIGFuZHJlIHJlZ2lvbmVyLCBtZW4gaGVyIHNlciB2aSB0YWxsZW5lIHDDpSBkZSBzb20gcGVuZGxlciBpIEhhdWdhbGFuZHNyZWdpb25lbi4gIAoKVmkgdmV0IGF0IEhhdWdlc3VuZCBlciByZWdpb25zZW50cnVtIG1lZCBzeWtlaHVzIG9nIGjDuGdza29sZS4gU2FtdGlkaWcgaGFyIEhhdWdlc3VuZCBmbGVyZSBvbGplIG9nIHNqw7hmYXJ0c27DpnJpbmdlci4gIERldCBlciBzZW50cmFsaXNlcnQgc29tIGJldHlyIGF0IGRldCBlciBncnVubmxhZyBmb3IgZXQgc3TDuHJyZSBqb2JibWFya2VkLiBEZXQgZXIgw6Vyc2FrZW4gdGlsIGF0IEhhdWdlc3VuZCBoYXIgbWVyIGlubnBlbmRsaW5nIGVubiBkZSBhbmRyZSBrb21tdW5lbmUgaSByZWdpb25lbi4gS2FybcO4eSBvZyBUeXN2w6ZyIHNvbSBsaWdnZXIgbsOmcm1lc3QgSGF1Z2VzdW5kIGhhciBzdMO4cnN0IGFuZGVsIHV0cGVuZGxpbmcsIG9nc8OlIHRpbCBIYXVnZXN1bmQuICAKCmBgYHtyIFBlbmRsaW5nIGkgU3VubmhvcmRsYW5kfQpzdW5fUGVuZGxpbmcKYGBgCgotICAgCgpgYGB7ciBzaXN0ZX0KIyBTaXN0ZQpgYGAKCi0gICAK
=======
LS0tDQp0aXRsZTogIkFyYmVpZHNrcmF2IHbDpXJlbiAyMDIyIg0KYXV0aG9yOg0KLSBLZXZpbiBIYQ0KLSBPbGEgQW5kcmUgT2xvZnNzb24NCi0gQW5uIEVsaXNhYmV0aCBKYWNvYnNlbg0KLSBIZWlkaSBNYXJpZSBSb2xmc25lcw0KLSBEYW5pZWwgS2Fyc3RhZA0KLSBIZW5yaWV0dGUgSGFuc2VuDQotIFN1c2FubiBCaXJrZWxhbmQgU2l2ZXJ0c2VuDQotIFZpbGRlIEhhdWdsYW5kDQpzdWJ0aXRsZTogTVNCMTA2LCBBbnZlbmR0IGJ5LSBvZyByZWdpb25hbMO4a29ub21pDQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQpsYW5nOiBuby1OQg0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogc2VudGVuY2UNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7DQogIGxpYnJhcnkocmVhZHIpDQogIGxpYnJhcnkoZ2dwbG90MikNCiAgbGlicmFyeShrbml0cikNCiAgbGlicmFyeSh2aXJpZGlzKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCiAgbGlicmFyeShrYWJsZUV4dHJhKQ0KICB9KQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIGluY2x1ZGUgPSBUUlVFKQ0KYGBgDQoNCiMgUm9tbGlnZSBmb3Jza2plbGxlciBpIG7DpnJpbmdzc3RydWt0dXIsIHZpcmtuaW5nZXIgYXYgZWtzb2dlbmUgc2pva2sgaSBiYXNpc3N5c3NlbHNldHRpbmdlbiwgb2cgbG9rYWxlIGZvcnNramVsbGVyIEkgc3lzc2Vsc2V0dGluZ3N2ZWtzdC4NCg0KSSBkZW5uZSBvcHBnYXZlbiB2aWwgdmkgc2UgcMOlIG7DpnJpbmdzc3RydWt0dXJlciBww6UgSGF1Z2FsYW5kZXQsIFN1bm5ob3JkbGFuZCBvZyBIYXJkYW5nZXIuDQoNClByb2JsZW1zdGlsbGluZ2VyIG9nIGJlcmVnbmluZ2VyIHZpIHZpbCBzZSBuw6ZybWVyZSBww6UNCg0KLSAgIEJlc2tyaXZlIHNpdHVhc2pvbmVuIHNsaWsgZGVuIGVyIGZvciAyMDIwLCBvZyBmb3IgdXR2aWtsaW5nZW4gb3ZlciB0aWQuDQotICAgU3lzc2Vsc2V0dGluZ3N1dHZpa2xpbmdlbiBmb3IgdWxpa2UgbsOmcmluZ2VyIGkgdWxpa2Uga29tbXVuZXIgb2cgZm9yIHJlZ2lvbmVuIHNhbWxldC4NCi0gICBBbmRlbGVuIGF2IHN5c3NlbHNldHRpbmdlbiBpbm5lbmZvciBlbmtlbHRuw6ZyaW5nZXIsIG9nIHNhbW1lbmxpZ25lIHNpdHVhc2pvbmVuIG9nIHV0dmlrbGluZ2VuIGZvciBsb2thbGUga29tbXVuZXIgb2cgbG9rYWwgcmVnaW9uIG1lZCBkZXQgc29tIGdqZWxkZXIgZm9yIG5hc2pvbmVuIHNhbWxldC4NCi0gICBCZXJlZ25lIGxva2FsaXNlcmluZ3Nrdm90aWVudGVyIGZvciB1bGlrZSBuw6ZyaW5nZXIgaSB1bGlrZSBrb21tdW5lciwgb2cgZm9yIHJlZ2lvbmVuKGUpIHNhbWxldC4NCi0gICBCZXJlZ25lIHVsaWtlIGFnZ3JlZ2VyaW5nc25pdsOlZXIgYXYgbsOmcmluZ2VyIG9nIGdlb2dyYWZpLCBpZGVudGlmaXNlciBtdWxpZ2Uga2x5bmdlciBiYXNlcnQgcMOlIHZlcmRpZW5lIGZvciBsb2thbGlzZXJpbmdza3ZvdGllbnRlbmUuDQotICAgR2rDuHJlIGVuIHZ1cmRlcmluZyBhdiBodm9yIGtvbnNlbnRyZXJ0L3NwcmVkdCBlbiBuw6ZyaW5nIGVyIGZvcmRlbHQgbWVsbG9tIGtvbW11bmVuZSBpIHJlZ2lvbmVuLCBiYXNlcnQgcMOlIGJlcmVnbmluZ2VyIGF2IGRlbiByb21saWdlIEdpbmktaW5kZWtzZW4uDQotICAgVnVyZGVyZSBvbSBzYW1tZW5saWduaW5nc2dydW5ubGFnZXQgYsO4ciB2w6ZyZSBzYW1sZXQgc3lzc2Vsc2V0dGluZyBpIHJlZ2lvbmVuLCBlbGxlciBzYW1sZXQgc3lzc2Vsc2V0dGluZyBhdiBuYXNqb25lbiwgb2cgZmlubmUgdXQgaHZpbGtlbiByb2xsZSBkZXQgc3BpbGxlciBvbSBlbiBicnVrZXIgcmVnaW9uYWxlIGVsbGVyIG5hc2pvbmFsZSBhbnNsYWcgZm9yIHNhbWxldCBzeXNzZWxzZXR0aW5nLg0KLSAgIEZpbm5lIHV0IG9tIG7DpnJpbmdzc3RydWt0dXJlbiBpIHJlZ2lvbmVuIGhhciBibGl0dCBtZXIgZWxsZXIgbWluZHJlIGRpdmVyc2lmaXNlcnQsIG1hbmdmb2xkaWcsIG92ZXIgdGlkLg0KLSAgIEJlcmVnbmUgZW4gcmVnaW9uYWwgbWFuZ2ZvbGQtaW5kZWtzIG9nIGZpbm5lIHV0IGh2b3JkYW4gdmVyZGllbmUgcMOlIGVuIHNsaWsgaW5kZWtzIGVyIGVuZHJldCBvdmVyIHRpZC4NCi0gICBWdXJkZXJlIG9tIHN5c3NlbHNldHRpbmdzYW5kZWxlbmUgc2thbCBzYW1tZW5saWduZXMgbWVkIG5hc2pvbmFsZSBlbGxlciByZWdpb25hbGUgYW5kZWxlciBmb3IgZGUgdWxpa2UgbsOmcmluZ2VuZQ0KLSAgIEdqZW50YSBiZXJlZ25pbmdlciBmb3IgYW5kZWxlciBhdiBhcmJlaWRzdGFrZXJlIGkgdWxpa2UgbsOmcmluZ2VyLCBsb2thbGlzZXJpbmdza3ZvdGllbnRlciwgZGVuIHJvbWxpZ2UgR2luaS0ga29lZmZpc2llbnRlbiBvZyBtw6VsZXQgZm9yIG1hbmdmb2xkIGF2IG7DpnJpbmdlciwgbWVkIHV0Z2FuZ3NwdW5rdCBpIGRhdGEgc3Blc2lmaXNlcnQgZXR0ZXIgYXJiZWlkc3Rha2VybmVzIGJvc3RlZC4NCi0gICBTYW1tZW5saWduZSByZXN1bHRhdGVuZSBmb3IgZGF0YSBldHRlciBhcmJlaWRzc3RlZCwgb2cga29tbWVudGVyIGh2aWxrZW4gaW5mb3JtYXNqb24gcmVzdWx0YXRlbmUgZ2lyIG9tIHJvbWxpZyBtb2JpbGl0ZXQgaSBhcmJlaWRzbWFya2VkZXQuDQotICAgR2kgZW4ga29ydCBvdmVyc2lrdCBvdmVyIHBlbmRsZXJzdHLDuG1tZXIgbWVsbG9tIGtvbW11bmVuZSBpIHJlZ2lvbmVuDQotICAgQmVyZWduZSBvZyBwcmVzZW50ZXJlIGFuZGVsZXIgYXYgYXJiZWlkc3Rha2VyZSBtZWQgYm9zdGVkIGkgZW4ga29tbXVuZSBzb20gaGFyIGFyYmVpZHNzdGVkIGkgYW5kcmUga29tbXVuZXIsIG9nIGdqw7hyIGRldCBzYW1tZSBmb3IgYW5kZWxlbiBhdiBqb2JiZW5lIGkgZW4ga29tbXVuZSBzb20gZXIgYmVzYXR0IGF2IGFyYmVpZHN0YWtlcmUgZnJhIGFuZHJlIGtvbW11bmVyLg0KLSAgIERpc2t1dGVyZSBmb3Jza2plbGxlciBtZWxsb20ga29tbXVuZW5lIGkgcmVnaW9uZW4sIG9nIGRyw7hmdCB1dHZpa2xpbmdlbiBvdmVyIHRpZCBmb3IgdWxpa2Uga29tbXVuZXINCi0gICBCZXJlZ25lIG9nIHByZXNlbnRlcmUgYW5kZWxlbiBhdiBhcmJlaWRzdGFrZXJlIHNvbSBib3Igb2cgam9iYmVyIGlubmVuZm9yIHNhbW1lIGtvbW11bmUuIFNlIG9tIGRldCBlciBzeXN0ZW1hdGlza2UgZm9yc2tqZWxsZXIgc2V0dCBpIGZvcmhvbGQgdGlsIHNlbnRyYWxpdGV0IG9nIHRpbGdqZW5nZWxpZ2hldCBpIGRldCBsb2thbGUgYXJiZWlkc21hcmtlZGV0LiBPZyBvbSBkZXQgZXIgYmVzdGVtdGUgdHJlbmRlciBpIHV0dmlrbGluZ2VuIGZvciB1bGlrZSBrb21tdW5lci4NCi0gICBCcnVrZSBiZXJlZ25pbmdlbmUgYXYgbG9rYWxpc2VyaW5na3ZvdGllbnRlciB0aWwgw6UgZGVsZSBuw6ZyaW5nZW5lIGlubiBpIGxva2FsLSBvZyBiYXNpc27DpnJpbmdlcg0KLSAgIEZvcm11bGVyZSBlbiDDuGtvbm9taXNrIGJhc2Vtb2RlbGwgb2cgYmVyZWduZSDDuGtvbm9taXNrZSBiYXNlbXVsaXBsaWthdG9yZXIgZm9yIGVua2VsdGtvbW11bmVyIG9nIHJlZ2lvbihlcikuDQotICAgVnVyZGVyZSBsb2thbGUgdmlya25pbmdlciBhdiBhbHRlcm5hdGl2ZSBsb2thbGlzZXJpbmdlciBpIE9kZGEsIEh1c25lcyBvZyBMZWlydmlrDQotICAgRHLDuGZ0ZSB2aXJrbmluZ2VyIGF2IGV0IHNsaWt0IHBvc2l0aXZ0IGVrc29nZW50IHNqb2trIGZvciBkZW4gbG9rYWxlIMO4a29ub21pZW4gZ2plbm5vbSBicnVrIGF2IGVuIGJhc2Vtb2RlbGwNCi0gICBGaW5uZSB1dCBodm9yZGFuIHZpcmtuaW5nZW5lIGV2ZW50dWVsdCBzcHJlcyB0aWwgYW5kcmUga29tbXVuZXIgaSByZWdpb25lbiBvZyBodm9yZGFuIGVuIGthbiBicnVrZSBkYXRhIGZvciBwZW5kbGVzdHLDuG1tZXIgdGlsIMOlIHByZWRpa2VyZSB2aXJrbmluZ2VyIHDDpSBzeXNzZWxzZXR0aW5nZW4gaSB1bGlrZSBrb21tdW5lci4NCi0gICBTYW1tZW5saWduZSBkaXNzZSBwcmVkaWtzam9uZW5lIG1lZCBkZSB2aSBmw6VyIG7DpXIgdmkgZ2plbm5vbWbDuHJlciBhbmFseXNlbiBww6UgcmVnaW9uYWx0IG5pdsOlLg0KLSAgIEdpIGVuIHNoaWZ0LXNoYXJlIGFuYWx5c2UgaSBlbiBkaXNrdXNqb24gYXYgZm9yc2tqZWxsZXIgaSB2ZWtzdCBmb3IgZWtzZW1wZWwgbWVsbG9tIGluZHJlLCBtaWR0cmUgb2cgeXRyZSBkZWxlciBhdiByZWdpb25lbiwgZWxsZXIgZXZlbnR1ZWx0IG9tcsOlZGVyL2tvbW11bmVyIHNvbSBoYXIgaGF0dCBzdGVyayBvZyBzdmFrIGJlZm9sa25pbmdzdXR2aWtsaW5nLg0KDQojIyBPdmVyc2lrdCBvdmVyIGJlZm9sa25pbmdlbmUgaSByZWdpb25lbmUNCg0KIyMjIEhhdWdhbGFuZGV0DQpIYXVnYWxhbmRldCBiZXN0w6VyIGF2IGtvbW11bmVuZSBCb2tuICg4NTIpLCBIYXVnZXN1bmQgKDM3MzU3KSwgS2FybcO4eSAoNDIxODYpLCBTYXVkYSAoNDU5NSksIFR5c3bDpnIoMTEwNjUpLCBVdHNpcmEoMTk4KSBvZyBWaW5kYWZqb3JkKDg3MTQpLiB0aWxzYW1tZW4gYm9yIGRldCAxMDQ5NjcgcGVyc29uZXIgaSBkZW5uZSByZWdpb25lbi4gaSB0aWRzcGVyaW9kZW4gdmkgaGFyIGhlbnRldCBpbm4gZGF0YSBoYXIgZGV0IHZlcnQga29tbXVuZXNhbW1lbnNsw6VpbmcgaSBkZW5uZSByZWdpb25lbi4gRGEgYmxlIMOYbGVuIG9nIHZpbmRhZmpvcmQgc2zDpXR0IGkgc2FtbWVuIHRpbCBlbiBrb21tdW5lIChodm9yZGFuIGhhciB2aSB0YXR0IGhlbnN5biB0aWwgZGV0dGU/Pz8pDQoNCiMjIyBTdW5uaG9yZGxhbmQgb2cgVWxsZW5zdmFuZw0KU3VubmhvcmRsYW5kIG9nIFVsbGVuc3ZhbmcgYmVzdMOlciBhdiBrb21tdW5lbmUgQsO4bWxvKDExOTU3KSwgRXRuZSg0MDYyKSwgRml0amFyKDMxODkpLCBLdmlubmhlcmFkKDEzMDcxKSwgU3RvcmQoMTg3NTkpLCBTdmVpbyg1NzY2KSwgVHlzbmVzKDI4NjkpIG9nIFVsbGVuc3ZhbmcoMTEwNDgpLiBUaWxzYW1tZW4gYm9yIGRldCA3MDcyMSBwZXJzb25lciBpIGRlbm5lIHJlZ2lvbmVuLg0KDQpUYWxsZW5lIGVyIGhlbnRldCBmcmEgU1NCIDA5LjAxLjIxIChodHRwczovL3d3dy5zc2Iubm8vc3RhdGJhbmsvdGFibGUvMDEyMjMvdGFibGVWaWV3TGF5b3V0MS8pIGdqZWxkZXIgZm9yIDQga3ZhcnRhbCAyMDIwLg0KDQpgYGB7ciBjc3ZfZmlsZXJ9DQpzeXNzZWxfYXJiIDwtIHJlYWRfY3N2KCJEYXRhL3N5c3NlbF9hcmIuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCmhsZF9hcmIgPC0gcmVhZF9jc3YoIkRhdGEvaGxkX2FyYi5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0Kc3VuX2FyYiA8LSByZWFkX2NzdigiRGF0YS9zdW5fYXJiLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpoYXJfYXJiIDwtIHJlYWRfY3N2KCJEYXRhL2hhcl9hcmIuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCnN5c3NlbF9ib3MgPC0gcmVhZF9jc3YoIkRhdGEvc3lzc2VsX2Jvcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0KaGxkX2JvcyA8LSByZWFkX2NzdigiRGF0YS9obGRfYm9zLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpzdW5fYm9zIDwtIHJlYWRfY3N2KCJEYXRhL3N1bl9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCmhhcl9ib3MgPC0gcmVhZF9jc3YoIkRhdGEvaGFyX2Jvcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0KUGVuZGxpbmcgPC0gcmVhZF9jc3YoIkRhdGEvUGVuZGxpbmcuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCmhnbF9QZW5kbGluZyA8LSByZWFkX2NzdigiRGF0YS9oZ2xfUGVuZGxpbmcuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCnN1bl9QZW5kbGluZyA8LSByZWFkX2NzdigiRGF0YS9zdW5fUGVuZGxpbmcuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCmBgYA0KDQojIDEgU3lzc2Vsc2V0dGluZyBpIHVsaWtlIG7DpnJpbmdlciwgZXR0ZXIgYXJiZWlkc3N0ZWQNCg0KIyMgSGF1Z2FsYW5kZXQNCg0KRsO4cnN0ZSByZWdpb25lbiB2aSB2ZWxnZXIgw6Ugc2UgcMOlIGVyIEhhdWdhbGFuZGV0LiBIZXIgw7huc2tlciB2aSDDpSBzZSBww6UgdXR2aWtsaW5nZW4gZnJhIDIwMDggdGlsIDIwMjAsIGF2IGFudGFsbCBhbnNhdHRlIGkgc2luIGhlbGhldCBpIHJlZ2lvbmVuLCBzYW10IGRlIDYgbWVzdCByZWxldmFudGUgbsOmcmluZ2VuZS4NCg0KYGBge3IgQXJiZWlkc3N0ZWRfSGF1Z2FsYW5kZXRfMX0NCmhsZF9hcmIgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gw4VyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4gMTogSGF1Z2FsYW5kZXQiKSsNCiAgeWxhYigiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkNCmBgYA0KDQpJIDIwMjAgZXIgZGV0IGkgdW5kZXJrYW50IGF2IDUwIDAwMCBhbnNhdHRlIGkgYWxsZSBuw6ZyaW5nZXIgcMOlIEhhdWdhbGFuZGV0LiBBdiBGaWcuIDEgc2VyIHZpIGF0IEhhdWdhbGFuZGV0IGZpa2sgZW4gbmVkZ2FuZyBpIGFudGFsbCBhbnNhdHRlIGkgMjAxNSBvZyAyMDE2LiBJIDIwMTcgb2cgMjAxOCBibGUgZGV0IHZla3N0LCBmcmVtIHRpbCBkZXQgc251ZGRlIGkgMjAxOSBpZ2plbi4NCg0KYGBge3IgQXJiZWlkc3N0ZWRfSGF1Z2FsYW5kZXRfMn0NCnN5c3NlbF9hcmIgJT4lIA0KICBmaWx0ZXIoa25yICVpbiUgYygxMTA2LCAxMTM1LCAxMTQ1LCAxMTQ2LCAxMTQ5LCAxMTUxLCAxMTYwKSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCwgKGFuZ2xlPTApKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKw0KICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJGaWcuIDI6IEhhdWdhbGFuZGV0IiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpJIEZpZy4gMiBzZXIgdmkgYXQgZmxlcmUgYXYga29tbXVuZW5lIHDDpSBIYXVnYWxhbmRldCBoYXIgaGF0dCBsaXRlbiBhcmJlaWRzcGxhc3N2ZWtzdCwgbWVkIHVubnRhayBhdiBUeXN2w6ZyLCBWaW5kYWZqb3JkIG9nIEthcm3DuHkgaSBkZW4gc2lzdGUgdGnDpXJzcGVyaW9kZW4uIFZpIHNlciBkZXR0ZSBtZXIgdHlkZWxpZyBww6UgZmlnLiAzIG9nIDQuDQoNCmBgYHtyIGhsZF9hcmJfbG9uZ30NCmhsZF9hcmJfbG9uZyA8LSBzeXNzZWxfYXJiICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsDQogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsDQogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdfVG90YWxfSGF1Z2FsYW5kZXRfM19TdMO4cnN0ZV9BcmJlaWRzdGVkfQ0KaGxkX2FyYl9sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiVmluZGFmam9yZCIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4gMzogSGF1Z2FsYW5kZXQ6IEhhdWdlc3VuZCwgS2FybcO4eSBvZyBWaW5kYWZqb3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhdWdhbGFuZGV0XzRfTWluc3RlX0FyYmVpZHN0ZWR9DQpobGRfYXJiX2xvbmcgJT4lIA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCb2tuIiwgIlNhdWRhIiwgIlR5c3bDpnIiLCAiVXRzaXJhIikpICU+JSANCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBBbnNhdHRlKSkgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogIGxhYnModGl0bGUgPSAiRmlnLiA0OiBIYXVnYWxhbmRldDogQm9rbiwgU2F1ZGEgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAyKSkgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQ0KYGBgDQoNCkZpZ3VyIDMgb2cgNCB2aXNlciB1dHZpa2xpbmdlbiBhdiBkZXQgdG90YWxlIGFudGFsbCBhbnNhdHRlIGkgYWxsZSBuw6ZyaW5nZXIgcMOlIGtvbW11bmFsdCBuaXbDpSwgaW5uZW5mb3IgSGF1Z2FsYW5kLXJlZ2lvbmVuLg0KDQpJIGRpc3NlIGZpZ3VyZW5lLCBzw6Ugc2VyIHZpIHR5ZGVsaWcgYXQgSGF1Z2VzdW5kIGhhciBoYXR0IHJlZHVrc2pvbiBpIGFudGFsbCBhbnNhdHRlIHRvdGFsdCBzZXR0LCBtZW5zIEthcm3DuHksIFZpbmRhZmpvcmQgb2cgVHlzdsOmciBoYXIgaGF0dCBlbiBtYXJrYW50IHZla3N0IGRlIHNpc3RlIHRpIMOlcmVuZS4gU2lkZW4gSGF1Z2VzdW5kIGhhciBmbGVzdCBhcmJlaWRzcGxhc3NlciBiZXR5ciB1dHZpa2xpbmdlbiBpIEhhdWdlc3VuZCBteWUgZm9yIGRlIHNhbWxlZGUgdGFsbGVuZS4NCg0KYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhdWdlbGFuZGV0XzNfU3TDuHJzdGVfQXJiZWlkc3N0ZWR9DQpobGRfYXJiX2xvbmcgJT4lIA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJIYXVnZXN1bmQiLCAiS2FybcO4eSIsICJWaW5kYWZqb3JkIikpICU+JSANCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsNCiAgbGFicyh0aXRsZSA9ICJGaWcuIDU6IEhhdWdhbGFuZGV0OiBIYXVnZXN1bmQsIEthcm3DuHkgb2cgVmluZGFmam9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfNF9NaW5zdGVfQXJiZWlkc3N0ZWR9DQpobGRfYXJiX2xvbmcgJT4lIA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCb2tuIiwgIlNhdWRhIiwgIlR5c3bDpnIiLCAiVXRzaXJhIikpICU+JSANCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsNCiAgbGFicyh0aXRsZSA9ICJGaWcuIDY6IEhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSwgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQpgYGANCg0KRmlndXIgNSBvZyA2IHZpc2VyIHV0dmlrbGluZ2VuIGF2IGRlIDYgbWVzdCByZWxldmFudGUgbsOmcmluZ2VuZSBpIEhhdWdhbGFuZHNyZWdpb25lbiBww6Uga29tbXVuZSBuaXbDpS4NCg0KVmkgc2VyIGkgZGUgdHJlIHN0w7hyc3RlIGtvbW11bmVuZSwgSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFZpbmRhZmpvcmQgdXRnasO4ciBuw6ZyaW5nZW5lIEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIgb2cgSW5kdXN0cmkgZGUgc3TDuHJzdGUuIEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIgaGFyIHZva3N0IGpldm50IG9nIHRydXR0IGRlIHNpc3RlIHRpw6VyZW5lLCBtZW5zIGFudGFsbCBhbnNhdHRlIGkgaW5kdXN0cmluw6ZyaW5nZW4gaGFyIHZhcmllcnQgZnJhIGtvbW11bmUgdGlsIGtvbW11bmUuIEkgSGF1Z2FsYW5kZXQgdXRnasO4ciBwcmltw6ZybsOmcmluZ2VyIChqb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UpIGVuIHN0w7hycmUgYW5kZWwsIGVubiBob3MgS2FybcO4eSBvZyBIYXVnZXN1bmQgaHZvciBwcmltw6ZybsOmcmluZ2VuZSBrdW4gdXRnasO4cmUgZW4gbGl0ZW4gYW5kZWwuDQoNCiMjIyBTeXNzZWxzZXR0aW5nc3V0dmlrbGluZ2VuIGZvciB1bGlrZSBuw6ZyaW5nZXIgaSB1bGlrZSBrb21tdW5lciBvZyBmb3IgcmVnaW9uZW4gc2FtbGV0LiANCg0KRGV0IGVyIHJlbGF0aXZ0IHN0b3JlIGtvbW11bmV2aXNlIGZvcnNramVsbGVyIGkgbsOmcmluZ3NzdHJ1a3R1cmVuLg0KUm9nYWxhbmQgaGFyIGVuIGZvcmhvbGRzdmlzIGVuc2lkaWcgbsOmcmluZ3NzdHJ1a3R1ciwgb2xqZSBvZyBnYXNzIGVyIGRvbWluZXJlbmRlLiBGeWxrZXQgZXIgc3V2ZXJlbnQgZG9taW5lcmVuZGUgZm9yIGZvc3NpbCBlbmVyZ2kuIERlIGhhciBmb3Igw7h2cmlnIGRlIHNpc3RlIMOlcmVuZSBzYXRzZXQgcMOlIGV0IGVuIG1lciBkaWZmZXJlbnNpZXJ0IG7DpnJpbmdzc3RydWt0dXIgb2cgbsOmcmluZ3NsaXYgdmVkIMOlIHNhdHNlIHDDpSBoZWxzZSwgSUtUIG9nIGZvcm55YmFyIGVuZXJnaS4NCg0KSSB2w6VyZSBtb2RlbGxlciwgZXIgc2F0c2luZ2VuIHDDpSBoZWxzZSBkZW4gbWVzdCB0eWRlbGlnZS4gQXYgcmVudCB0ZWtuaXNrZSBncnVubmVyIGVyIGRldCB2YW5za2VsaWcgw6Ugc2UgdXR2aWtsaW5nZW4gaSBlbmtlbHRlIG7DpnJpbmdlciBzb20gdXRnasO4ciBzbcOlIGFuZGVsZXIsIHDDpSBncnVubiBhdiBza2FsYWVuIHNvbSBlciBiZW55dHRldC4gVGlsIHRyb3NzIGZvciBkZXR0ZSwga2FuIG1hbiBzZSBhdCBuw6ZyaW5nc3N0cnVrdHVyZW4gaSByZWdpb25lbiBzYW1sZXQgZ2VuZXJlbHQgc2V0dCBoYXIgZW5kcmV0IHNlZyBsaXRlLg0KDQpSb2dhbGFuZCBoYXIgZ29kZSBqb3JkYnJ1a3NtdWxpZ2hldGVyLCBtZW4gaSBGaWcuIDI6IEhhdWdhbGFuZGV0IHNlciB2aSBlbiBuZWRnYW5nIGkgc3lzc2Vsc2V0dGluZ2VuIGRlIHNpc3RlIHRpw6VyZW5lLCBtZW5zIGRldCBlciBlbiBtYXJnaW5hbCDDuGtuaW5nIGkgU3VubmhvcmRhbGFuZCwgamYuIEZpZyA5LiBJIEZpZy4gMTI6IHNlciB2aSBhdCBUeXNuZXMgaGFyIGhhdHQgZW4gbWFya2FudCDDuGtuaW5nIGkgcHJpbcOmcm7DpnJpbmdlbiwgcmVsYXRpdnQgc2V0dC4NCg0KVW5pdmVyc2l0ZXRzLSBvZyBow7hnc2tvbGVzZWt0b3JlbiBlciBsaXRlbiBpIFJvZ2FsYW5kLCBvZyBkZW4gYmVzdMOlciBmb3IgZGV0IGbDuHJzdGUgYXYgVW5pdmVyc2l0ZXRldCBpIFN0YXZhbmdlciAoVWlTKSBvZyBIw7hnc2t1bGVuIHDDpSBWZXN0bGFuZGV0IChIVkwpIG1lZCBjYW1wdXMgSGF1Z2VzdW5kLg0KDQpIYXVnYWxhbmQgVmVrc3QsIHNvbSBlciBlaWdkL2RyZXZldCBhdiBIYXVnYWxhbmRzcmVnaW9uZW4gZXIgaSBzcGlzc2VuIHDDpSDDpSBsZWdnZSB0aWwgcmV0dGUgZm9yIMOlIGV0YWJsZXJlIG55IGluZHVzdHJpIHNhbXQgYW5kcmUgYXJiZWlkc3BsYXNzZXIgaSByZWdpb25lbi4NCg0KSSBoZWxzZXNla3RvcmVuIGVyIFN0YXZhbmdlciB1bml2ZXJzaXRldHNzeWtlaHVzIChTdVMpIHNlbnRyYWx0Lg0KDQojIyBTdW5uaG9yZGxhbmQNCg0KVmlkZXJlIMO4bnNrZXIgdmkgw6Ugc2UgcMOlIGRlbiBzYW1tZSB1dHZpa2xpbmdlbiwgbWVuIGRlbm5lIGdhbmdlbiBpIFN1bm5ob3JkbGFuZHNyZWdpb25lbi4NCg0KYGBge3IgQXJiZWlkc3N0ZWRfU3VubmhvcmRsYW5kXzF9DQpzdW5fYXJiICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJGaWcuIDc6IFN1bm5ob3JkYWxhbmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpDQpgYGANCg0KSGVyIHZpc2VyIGZpZ3VyIDcgdXR2aWtsaW5nZW4gdGlsIGRlbiB0b3RhbGUgc3VtbWVuIGF2IGFuc2F0dGUgaSBTdW5uaG9yZGxhbmRzcmVnaW9uZW4gZnJhIDIwMDggdGlsIDIwMjAuIFN1bm5ob3JkYWxhbmQgaGFyIGkgMjAyMCBpIHVuZGVya2FudCBhdiAyNSA1MDAgYW5zYXR0ZS4gVmkgc2VyIHV0IGlmcsOlIGZpZ3VyZW4gYXQgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIGhhZGRlIGVpbiBtYXJrYW50IHZla3N0IGlmcsOlIDIwMDggdGlsIDIwMTQgbWVkIHBlcmlvZGFyIG1lZCBzdmFrIG5lZGdhbmcuIEZyYSAyMDE0IGhhciBkZXQgdsOmcnQgZW4gcmVkdWtzam9uIGkgdG90YWx0IGFudGFsbCBhbnNhdHRlLg0KDQpgYGB7ciBBcmJlaWRzc3RlZF9TdW5uaG9yZGxhbmRfMn0NCnN5c3NlbF9hcmIgJT4lIA0KICBmaWx0ZXIoa25yICVpbiUgYyg0NjExLCA0NjEyLCA0NjEzLCA0NjE0LCA0NjE1LCA0NjE2LCA0NjE3KSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsNCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsNCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhzZXEoMi4wLCAyLCBieSA9IC0wLjEpKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICAgbGFicyh0aXRsZSA9ICJGaWcuIDg6IFN1bm5ob3JkbGFuZCIsIHggPSAiw4VyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpGaWd1ciA4IHZpc2VyIHV0dmlrbGluZ2VuIGF2IHRvdGFsdCBhbnNhdHRlIGkgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIHDDpSBrb21tdW5lbml2w6UgaSBoZWxlIHJlZ2lvbmVuIGZyYSAyMDA4IHRpbCAyMDIwLiBEZW5uZSBmaWd1cmVuIGdpciBvc3MgZW4gb3ZlcnNpa3QsIG1lbiBlciBpa2tlIGhlaWx0IGJydWtlcnZlbm5lbGlnLiBWaSBsYWdlciBkZXJtZWQgZW4gbWVyIG92ZXJzaWt0bGlnIGZpZ3VyLCBqZi4gZmlndXIgOSAmIDEwLg0KDQpgYGB7ciBzdW5fYXJiX2xvbmd9DQpzdW5fYXJiX2xvbmcgPC0gc3lzc2VsX2FyYiAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBgQWxsZSBOw6ZyaW5nZXJgOlVvcHBnaXR0LA0KICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLA0KICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nX1RvdGFsX1N1bm5ob3JkbGFuZF8zX1N0w7hyc3RlX0FyYmVpZHN0ZWR9DQpzdW5fYXJiX2xvbmcgJT4lIA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiS3Zpbm5oZXJhZCIsICJTdG9yZCIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4gOTogU3VubmhvcmRsYW5kOiBCw7htbG8sIEt2aW5uaGVyYWQgb2cgU3RvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAyKSkgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzRfTWluc3RlX0FyYmVpZHN0ZWR9DQpzdW5fYXJiX2xvbmcgJT4lIA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJFdG5lIiwgIkZpdGphciIsICJTdmVpbyIsICJUeXNuZXMiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IEFuc2F0dGUpKSArDQogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsNCiAgbGFicyh0aXRsZSA9ICJGaWcuIDEwOiBTdW5uaG9yZGxhbmQ6IEV0bmUsIEZpdGhhciwgU3ZlaW8gb2cgVHlzbmVzIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkNCmBgYA0KDQpWaSBzZXIgaGVyIHV0IGlmcmEgZmlndXIgOSBvZyAxMCB1dHZpa2xpbmdlbiBmb3IgaHZlciBlbmtlbHQga29tbXVuZSBpIFN1bm5ob3JkbGFuZCB0b3RhbHQgc2V0dCwgb2cgaGVyIHNlciB2aSBteWUgdHlkbGlnZXJlIHV0dmlrbGluZ2VuIGZyYSAyMDA4IHRpbCAyMDIwLiBFbiBrYW4gc2UgaGVyIGF0IEt2aW5uaGVyYWQsIEV0bmUgb2cgRml0amFyIGhhciBoYXR0IGVuIHJlZHVrc2pvbiBpIHRvdGFsdCBhbnNhdHRlLCBtZW5zIFR5c25lcyBvZyBTdmVpbyBoYXIgaGF0dCBlaW4ga3JhZnRpZyB2ZWtzdC4gRW4gaW50ZXJlc3NhbnQgYmVtZXJraW5nIGVyIFN0b3JkIGkgMjAxNCBvZyBLdmlubmhlcmFkIGZyYSAyMDA4IHRpbCAyMDE3Lg0KDQpGb3Igw6UgZsOlIGV0IGJlZHJlIG92ZXJzaWt0IG92ZXIgdXR2aWtsaW5nZW4gaSBrb21tdW5lbiDDuG5za2VyIHZpIMOlIHNlIHDDpSBkZSA2IG1lc3QgcmVsZXZhbnRlIG7DpnJpbmdlbmUgaSBodmVyIGtvbW11bmUuDQoNCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfM19TdMO4cnN0ZV9BcmJlaWRzc3RlZH0NCnN1bl9hcmJfbG9uZyAlPiUgDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkLDuG1sbyIsICJTdG9yZCIsICJLdmlubmhlcmFkIikpICU+JSANCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsNCiAgbGFicyh0aXRsZSA9ICJGaWcuIDExOiBTdW5uaG9yZGxhbmQ6IELDuG1sbywgS3Zpbm5oZXJhZCBvZyBTdG9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDIpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpDQpgYGANCg0KYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX1N1bm5ob3JkbGFuZF80X01pbnN0ZV9BcmJlaWRzc3RlZH0NCnN1bl9hcmJfbG9uZyAlPiUgDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkV0bmUiLCAiU3ZlaW8iLCAiRml0amFyIiwgIlR5c25lcyIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIGxhYnModGl0bGUgPSAiRmlnLiAxMjogU3VubmhvcmRsYW5kOiBFdG5lLCBGaXRqYXIsIFN2ZWlvIG9nIFR5c25lcyIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpGaWd1ciAxMSBvZyAxMiB2aXNlciBkZSA2IG1lc3QgcmVsZXZhbnRlIG7DpnJpbmdlbmUgaSBodmVyIGVua2VsdCBrb21tdW5lIGkgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIGZyYSAyMDA4IHRpbCAyMDIwLg0KDQpFbiBzZXIgdXQgaWZyYSBmaWd1ciAxMSBhdCBpIGRlIHRyZSBzdMO4cnN0ZSBrb21tdW5lbmUsICpCw7htbG8qLCAqS3Zpbm5oZXJhZCogb2cgKlN0b3JkKiBzw6UgaGFyIGRlIGFsbGUgaGF0dCBlbiByZWR1a3Nqb24gaSBpbmR1c3RyaWVuLCBzYW10aWRpZyBzb20gZGUgaGFyIGhhdHQgZW4gdmVrc3QgaSBoZWxzZS0gb2cgc29zaWFsdGplbmVzdGVyLiBUeXNuZXMgaGFyIHbDpnJ0IHN0YWJpbCBuw6VyIGRldCBrb21tZXIgdGlsIGluZHVzdHJpLCBtZW4gaGFyIHNldHQgZWluIG1hcmthbnQgdmVrc3QgaSBwcmltw6ZybsOmcmluZ2VuIChKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2UpLg0KDQojIyMgU3lzc2Vsc2V0dGluZ3N1dHZpa2xpbmdlbiBmb3IgdWxpa2UgbsOmcmluZ2VyIGkgdWxpa2Uga29tbXVuZXIgb2cgZm9yIHJlZ2lvbmVuIHNhbWxldC4NCg0KRGV0IGbDuHJzdGUgYmVtZXJrZWxzZXN2ZXJkaWdlIGkgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIGVyIGRlbiBtYXJrYW50ZSByZWR1a3Nqb25lbiBpIGluZHVzdHJpIGkgU3RvcmQga29tbXVuZSBpIDIwMTQsIHNhbXQgS3Zpbm5oZXJhZCBmcmEgMjAwOC4gRGV0dGUgc3RlbW1lciBvdmVyZW5zIG1lZCB0byBoZW5kZWxzZXIuIERlbiBmw7hyc3RlIGVyIG9samVrbmVra2VuIGkgMjAxNCBzb20gbWVkZsO4cnRlIGF0IGJsLmEuIEFrZXIgU3RvcmQgQVMgc29tIGVyIGF2aGVuZ2lnIGF2IE9samUtaW5kdXN0cmllbiBtw6V0dGUgcGVybWl0ZXJlLg0KDQpTdG9yZCBlciBlbiBrb21tdW5lIHNvbSBoYXIgbXllIG9mZnNob3JlIGluZHVzdHJpLiBJIDIwMDgvMjAwOSBzw6Ugc3Rlbmd0ZSBTw7hyLU5vcmdlIEFsdW1pbml1bSAiQi1IYWxsZW4iIHNvbSBtZWRmw7hydGUgNTAlIHJlZHVrc2pvbiBpIHByb2R1a3Nqb24sIG9nIGRlcm1lZCBhbnNhdHRlLiBJbnRlcmVzc2FudCDDpSBiZW1lcmtlIGF0IGkgS3Zpbm5oZXJhZCBzw6UgZXIgYW50YWxsIGluZHVzdHJpYXJiZWlkZXJlIHJlZHVzZXJ0IHNhbXRpZGlnIHNvbSBhbnRhbGwgYW5zYXR0ZSBpIEhlbHNlLSBvZyBTb3NpYWxldGplbmVzdGVyIMO4a3QuIELDuG1sbyBoYXIgb2dzw6Ugc2V0dCBlbiBzdGFiaWwgcmVkdWtzam9uIGkgYW5zYXR0ZSBpbm5lbiBpbmR1c3RyaSwgc2FtdCB2ZWtzdCBpIEhlbHNlLSBvZyBTb3NpYWxldGplbmVzdGVyIGZyZW0gdGlsIDIwMTguDQoNClNlciBlbiBww6UgaGVsZSBTdW5uaG9yZGxhbmRzcmVnaW9uZW4gaSBzaW4gaGVsaGV0LCBzw6Ugc2VyIHZpIGVuIHN2w6ZydCB0eWRlbGlnIHZla3N0IGlubmVuIEhlbHNlLSBvZyBTb3NpYWxldGplbmVzdGVyLCBvZyByZWR1a3Nqb24gaW5uZW4gaW5kdXN0cmkgaSBoZWxlIHJlZ2lvbmVuLiBLdmlubmhlcmFkLCBUeXNuZXMgb2cgRml0amFyIGhhciBvcHBsZXZkIGVpbiBtYXJrYW50IHZla3N0IGlubmVuIHByaW3DpnJuw6ZyaW5nLiAqKkthbiBkZXQgdmVyZSBlaW4gZ3J1bm4gdGlsIGRldHRlIHNvbSBidXJkZSBkaXNrdXRlcmFzdD8/KioNCg0KIyBGb3J0c2V0dCBIZXIgKE9BLCBLSCkNCg0KIyMgSGFyZGFuZ2VyDQoNClRpbCBzbHV0dCBtw6UgdmkgZ2plcmUgZGV0IHNhbW1lIG1lZCAqSGFyZGFuZ2VyKg0KDQpJIGhlbmhvbGQgdGlsIG9wcGdhdmVucyBrcmF2IHRpbCBiZXRyYWt0ZXIgdmkgKkhhcmRhbmdlciogZsO4ciAyMDE5IHNvbSBVbGxlbnN2YW5nLSBvZyBPZGRhIGtvbW11bmUgc29tIHRvIHNlcGFyZXJ0ZSBrb21tdW5lci4gaSAyMDIwIHPDpSBibGUgVWxsZW5zdmFuZywgT2RkYSBvZyBKb25kYWwgc2zDpXR0IHNhbW1lbiB0aWwgVWxsZW5zdmFuZy4gRGV0dGUgZm9ya2xhcmVyIGRlbiB2b2xkc29tbWUgw7hrbmluZ2VuIGkgc3lzc2Vsc2V0dGluZyBpIHJlZ2lvbmVuIHZlZCB0aWRzcHVua3RldCBmb3Iga29tbXVuZXNhbW1lbnNsw6VpbmcuDQoNCmBgYHtyIEFyYmVpZHNzdGVkX0hhcmRhbmdlcl8xfQ0KaGFyX2FyYiAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiRmlnLiAxMzogSGFyZGFuZ2VyIiwgeT0gIkFsbGUgTsOmcmluZ2VyIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDIpKQ0KYGBgDQoNCmBgYHtyIEFyYmVpZHNzdGVkX0hhcmRhbmdlcl8yfQ0Kc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSBjKDQ2MTgsIDEyMjgpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsNCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhzZXEoMi4wLCAyLCBieSA9IC0wLjEpKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICAgbGFicyh0aXRsZSA9ICJGaWcuIDE0OiBIYXJkYW5nZXIiLCB4ID0gIsOFciIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQpgYGANCg0KYGBge3IgaGFyX2FyYl9sb25nfQ0KaGFyX2FyYl9sb25nIDwtIHN5c3NlbF9hcmIgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYEFsbGUgTsOmcmluZ2VyYDpVb3BwZ2l0dCwNCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwNCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpDQpgYGANCg0KYGBge3IgTsOmcmluZ19Ub3RhbF9IYXJkYW5nZXJfQXJiZWlkc3RlZH0NCmhhcl9hcmJfbG9uZyAlPiUgDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIk9kZGEiLCAiVWxsZW5zdmFuZyIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4gMTU6IEhhcmRhbmdlcjogT2RkYSBvZyBVbGxlbnN2YW5nIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXJkYW5nZXJfQXJiZWlkc3N0ZWR9DQpoYXJfYXJiX2xvbmcgJT4lIA0KICBmaWx0ZXIoa25hdm4gJWluJSBjKCJPZGRhIiwgIlVsbGVuc3ZhbmciKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4gMTY6IEhhcmRhbmdlcjogT2RkYSwgVWxsZW5zdmFuZyIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KVWxsZW5zdmFuZyBrb21tdW5lIGhhciBzdG9yIGtyYWZ0cHJvZHVrc2pvbiBvZyBob3ZlZG7DpnJpbmdlbiBlciBpbmR1c3RyaS4gTWFqb3JpdGV0ZW4gYXYga3JhZnRwcm9kdWtzam9uZW4gZm9yZWfDpXIgaSB0aWRsaWdlcmUgT2RkYS4gT2RkYSBlciBldCBlbnNpZGlnIGluZHVzdHJpc3RlZCwgbWVuIGhhciBvZ3PDpSBlbiBtYXJpdGltIG7DpnJpbmcgaSB0aWxsZWdnLiBJIGZpZ3VyIDE2IHNlciB2aSBhdCBpbmR1c3RyaW7DpnJpbmdlbiB1dGdqw7hyIGVuIGJldHJha3RlbGlnIHN0w7hycmUgYW5kZWwgYXYgc3lzc2Vsc2V0dGluZ2VuIGkgaGVyLiBJbmR1c3RyaW7DpnJpbmdlbiBlciBvZ3PDpSBvbWZhdHRldCBvZyBieWdnLSBvZyBhbmxlZ2dzdmlya3NvbWhldC4gUMOlIG1vdHNhdHQgc2lkZSBlciBqb3JkYnJ1aywgaGVsc2UtIG9nIHNvc2lhbHRqZW5lc3RlciBkb21pbmVyZW5kZSBpIFVsbGVuc3ZhbmcuIA0KDQoqKkdlbmVyZWx0IG9tIFVsbGVuc3Zhbmcga29tbXVuZSoqDQoNClVsbGVuc3Zhbmcga29tbXVuZSAobWVkIE9kZGEpIGhhciBoYXR0IGVuIGpldm4gb2cgbmVnYXRpdiBiZWZvbGtuaW5nc3Zla3N0IGkgbWFuZ2UgdGnDpXIuIERldCBnamVuc3BlaWxlcyBpa2tlIHR5ZGVsaWcgaSB2w6VyZSBtb2RlbGxlciBww6UgZ3J1bm4gYXYgc2thbGFlbiBzb20gZXIgYnJ1a3QuIEkgdGlsbGVnZyBoYXIgdmkgaWtrZSBoZW5zeW50YXR0IGlubnZhbmRyZW5kZSBhcmJlaWRlcmUsIGVsbGVyIG1pZGxlcnRpZGlnZSBmcmFmbHl0dGVkZSBzb20gZm9yIGVrc2VtcGVsIHN0dWRlbnRlci4NCg0KIyAyIA0KDQpGaW5uZXIgbG9rYWxpc2VyaW5nc2t2b3RpZW50ZXIgZm9yIHVsaWtlIG7DpnJpbmdlciBpIHVsaWtlIGtvbW11bmVyLCBvZyBmb3IgcmVnaW9uZW4gc2FtbGV0DQoNCmBgYHtyfQ0KI29yZG5lciBldHRlciBrb21tdW5lbmF2biBvZyDDpXINCnRtcCA8LSBzeXNzZWxfYm9zDQpgYGANCg0KDQpgYGB7cn0NCmhhdTIwIDwtIHN5c3NlbF9ib3MgJT4lIA0KICBmaWx0ZXIoYWFyID09ICIyMDIwIiwga25hdm4gPT0gIkhhdWdlc3VuZCIpDQpgYGANCg0KYGBge3J9DQooaGF1MjAkSW5kdXN0cmkvaGF1MjAkYEFsbGUgTsOmcmluZ2VyYCkNCjE5MDUvMTgxMzcNCmBgYA0KDQpgYGB7cn0NCnN5c3NlbF9ib3MgPC0gc3lzc2VsX2JvcyAlPiUgDQogIG11dGF0ZShFaXJfRXJfaW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCm5hc2pvbmFsdF9ib3N0ZWQgPC0gcmVhZF9leGNlbCgiRGF0YS9uYXNqb25hbHRfYm9zdGVkLnhsc3giKQ0KYGBgDQoNCmBgYHtyfQ0KbmFzam9uYWx0X2Jvc3RlZCA8LSBuYXNqb25hbHRfYm9zdGVkICU+JSANCiAgbXV0YXRlKEVpbl9Fbl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaW5fRW5fSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWluX0VuX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWluX0VuX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApDQpgYGANCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIEZvcmVsw6VyIMOlIHbDpnJlIGxpdHQgbWVyIGZvcnNpa3RpZyBoZXIuIHN5c3NlbF9ib3MkRWlyX0VyX2luZHVzdHJpIGhhciBsZW5nZGUgMjA3DQojIDEzKjE1ICsgMTIgKGRlbiBzaXN0ZSBPZGRhKS4gbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSW5kdXN0cmkgaGFyIGxlbmdkZSAxMw0KIyBLb2RlbiBoZXIgZm9ydXRzZXR0ZXIgYXQgbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSW5kdXN0cmkga2FuIHJlcGxpa2VyZXMgMTYNCiMgZ2FuZ2VyLiBSaXNreSBpIHV0Z2FuZ3NwdW5rdGV0IG9nIGhlciBnw6VyIGRldCBnYWx0IHBnYS4gT2RkYSBtZWQgMTIgb2JzLg0KIyBNZWRmw7hyZXIgYXQgcmVzdWx0YXRldCBibGlyIGdhbHQgZXR0ZXIgT2RkYS4gRm9yZXNsw6VyIMOlIHRhIGRldCBtZXIgc3RlZ3ZpcyBzbGlrIGF0DQojIGVuIGdhciBtZXIga29udHJvbGwNCg0KTFFpbmR1c3RyaSA8LSBzeXNzZWxfYm9zICU+JSANCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9pbmR1c3RyaSkgJT4lIA0KICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSANCiAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9ib3N0ZWQsIGFhciwgRWluX0VuX0luZHVzdHJpKSwgYnkgPSBjKCJhYXIiKSkgJT4lIA0KICBtdXRhdGUoDQogIGFuZGVsID0gRWlyX0VyX2luZHVzdHJpL0Vpbl9Fbl9JbmR1c3RyaQ0KICApDQoNCiMgRGlzc2UgbcOlIGZpa3NlcyBww6UgdGlsc3ZhcmVuZGUgdmlzLiBIYXIgZmVpbCB2ZXJkaWVyIHNsaWsgZGUgZXIgbsOlIA0KTFFqb3JkYnJ1ayA8LSBhc190aWJibGUoc3lzc2VsX2JvcyRFaXJfRXJfSm9yZGJydWsvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSm9yZGJydWspDQpMUXVuZGVydmlzbmluZyA8LSBhc190aWJibGUoc3lzc2VsX2JvcyRFaXJfRXJfVW5kZXJ2aXNuaW5nL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX1VuZGVydmlzbmluZykNCkxRaGVsc2UgPC0gYXNfdGliYmxlKHN5c3NlbF9ib3MkRWlyX0VyX0hlbHNlL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX0hlbHNlKQ0KYGBgDQoNCmBgYHtyfQ0Kc3lzc2VsX2JvcyA8LSBzeXNzZWxfYm9zICU+JSANCiAgbXV0YXRlKExRaW5kdXN0cmkgPSBMUWluZHVzdHJpJGFuZGVsLA0KICAgICAgICAgTFFqb3JkYnJ1ayA9IExRam9yZGJydWssDQogICAgICAgICBMUXVuZGVydmlzbmluZyA9IExRdW5kZXJ2aXNuaW5nLA0KICAgICAgICAgTFFoZWxzZSA9IExRaGVsc2UpDQpgYGANCg0KDQpgYGB7cn0NCkxRYm9zIDwtIHN5c3NlbF9ib3MgJT4lIA0KICBzZWxlY3QoYWFyLCBrbmF2biwgTFFpbmR1c3RyaSwgTFFqb3JkYnJ1aywgTFF1bmRlcnZpc25pbmcsIExRaGVsc2UpDQpgYGANCg0KRm9yIHJlZ2lvbiBIYXVnYWxhbmQ6DQoNCmBgYHtyfQ0KaGxkX2Jvc19MUSA8LSBobGRfYm9zICU+JSANCiAgbXV0YXRlKEVpcl9Fcl9pbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApDQpgYGANCg0KYGBge3J9DQpMUWluZHVzdHJpX2hsZCA8LSBhc190aWJibGUoaGxkX2Jvc19MUSRFaXJfRXJfaW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSW5kdXN0cmkpDQpMUWpvcmRicnVrX2hsZCA8LSBhc190aWJibGUoaGxkX2Jvc19MUSRFaXJfRXJfSm9yZGJydWsvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSm9yZGJydWspDQpMUXVuZGVydmlzbmluZ19obGQgPC0gYXNfdGliYmxlKGhsZF9ib3NfTFEkRWlyX0VyX1VuZGVydmlzbmluZy9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9VbmRlcnZpc25pbmcpDQpMUWhlbHNlX2hsZCA8LSBhc190aWJibGUoaGxkX2Jvc19MUSRFaXJfRXJfSGVsc2UvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSGVsc2UpDQpgYGANCg0KYGBge3J9DQpobGRfYm9zX0xRIDwtIGhsZF9ib3NfTFEgJT4lIA0KICBtdXRhdGUoTFFpbmR1c3RyaSA9IExRaW5kdXN0cmlfaGxkJHZhbHVlLA0KICAgICAgICAgTFFqb3JkYnJ1ayA9IExRam9yZGJydWtfaGxkJHZhbHVlLA0KICAgICAgICAgTFF1bmRlcnZpc25pbmcgPSBMUXVuZGVydmlzbmluZ19obGQkdmFsdWUsDQogICAgICAgICBMUWhlbHNlID0gTFFoZWxzZV9obGQkdmFsdWUpICU+JSANCiAgc2VsZWN0KMOFciwgTFFpbmR1c3RyaSwgTFFqb3JkYnJ1aywgTFF1bmRlcnZpc25pbmcsIExRaGVsc2UpDQpgYGANCg0KRm9yIFN1bm5ob3JkYWxhbmQ6DQoNCmBgYHtyfQ0Kc3VuX2Jvc19MUSA8LSBzdW5fYm9zICU+JSANCiAgbXV0YXRlKEVpcl9Fcl9pbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApDQpgYGANCg0KYGBge3J9DQpMUWluZHVzdHJpX3N1biA8LSBhc190aWJibGUoc3VuX2Jvc19MUSRFaXJfRXJfaW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSW5kdXN0cmkpDQpMUWpvcmRicnVrX3N1biA8LSBhc190aWJibGUoc3VuX2Jvc19MUSRFaXJfRXJfSm9yZGJydWsvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSm9yZGJydWspDQpMUXVuZGVydmlzbmluZ19zdW4gPC0gYXNfdGliYmxlKHN1bl9ib3NfTFEkRWlyX0VyX1VuZGVydmlzbmluZy9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9VbmRlcnZpc25pbmcpDQpMUWhlbHNlX3N1biA8LSBhc190aWJibGUoc3VuX2Jvc19MUSRFaXJfRXJfSGVsc2UvbmFzam9uYWx0X2Jvc3RlZCRFaW5fRW5fSGVsc2UpDQpgYGANCg0KYGBge3J9DQpzdW5fYm9zX0xRIDwtIHN1bl9ib3NfTFEgJT4lIA0KICBtdXRhdGUoTFFpbmR1c3RyaSA9IExRaW5kdXN0cmlfc3VuJHZhbHVlLA0KICAgICAgICAgTFFqb3JkYnJ1ayA9IExRam9yZGJydWtfc3VuJHZhbHVlLA0KICAgICAgICAgTFF1bmRlcnZpc25pbmcgPSBMUXVuZGVydmlzbmluZ19zdW4kdmFsdWUsDQogICAgICAgICBMUWhlbHNlID0gTFFoZWxzZV9zdW4kdmFsdWUpICU+JSANCiAgc2VsZWN0KMOFciwgTFFpbmR1c3RyaSwgTFFqb3JkYnJ1aywgTFF1bmRlcnZpc25pbmcsIExRaGVsc2UpDQpgYGANCg0KRm9yIEhhcmRhbmdlcjoNCg0KYGBge3J9DQpoYXJfYm9zX0xRIDwtIGhhcl9ib3MgJT4lIA0KICBtdXRhdGUoRWlyX0VyX2luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9Kb3JkYnJ1ayA9IGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfVW5kZXJ2aXNuaW5nID0gVW5kZXJ2aXNuaW5nL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkNCmBgYA0KDQpgYGB7cn0NCkxRaW5kdXN0cmlfaGFyIDwtIGFzX3RpYmJsZShoYXJfYm9zX0xRJEVpcl9Fcl9pbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9JbmR1c3RyaSkNCkxRam9yZGJydWtfaGFyIDwtIGFzX3RpYmJsZShoYXJfYm9zX0xRJEVpcl9Fcl9Kb3JkYnJ1ay9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9Kb3JkYnJ1aykNCkxRdW5kZXJ2aXNuaW5nX2hhciA8LSBhc190aWJibGUoaGFyX2Jvc19MUSRFaXJfRXJfVW5kZXJ2aXNuaW5nL25hc2pvbmFsdF9ib3N0ZWQkRWluX0VuX1VuZGVydmlzbmluZykNCkxRaGVsc2VfaGFyIDwtIGFzX3RpYmJsZShoYXJfYm9zX0xRJEVpcl9Fcl9IZWxzZS9uYXNqb25hbHRfYm9zdGVkJEVpbl9Fbl9IZWxzZSkNCmBgYA0KDQpgYGB7cn0NCmhhcl9ib3NfTFEgPC0gaGFyX2Jvc19MUSAlPiUgDQogIG11dGF0ZShMUWluZHVzdHJpID0gTFFpbmR1c3RyaV9oYXIkdmFsdWUsDQogICAgICAgICBMUWpvcmRicnVrID0gTFFqb3JkYnJ1a19oYXIkdmFsdWUsDQogICAgICAgICBMUXVuZGVydmlzbmluZyA9IExRdW5kZXJ2aXNuaW5nX2hhciR2YWx1ZSwNCiAgICAgICAgIExRaGVsc2UgPSBMUWhlbHNlX2hsZCR2YWx1ZSkgJT4lIA0KICBzZWxlY3Qow4VyLCBMUWluZHVzdHJpLCBMUWpvcmRicnVrLCBMUXVuZGVydmlzbmluZywgTFFoZWxzZSkNCmBgYA0KDQoNCiMgMyBTeXNzZWxzZXR0aW5nIGkgdWxpa2UgbsOmcmluZ2VyLCBldHRlciBib3N0ZWQgKE1vZGVsbGVyIHVuZGVyIGFyYmVpZCkNCg0KIyMgSGF1Z2FsYW5kZXQNCg0KYGBge3IgQm9zdGVkX0hhdWdhbGFuZGV0XzF9DQpobGRfYm9zICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJIYXVnYWxhbmRldCIpKw0KICB5bGFiKCJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKQ0KYGBgDQoNCmBgYHtyIEJvc3RlZF9IYXVnYWxhbmRldF8yfQ0Kc3lzc2VsX2JvcyAlPiUgDQogIGZpbHRlcihrbnIgJWluJSBjKDExMDYsIDExMzUsIDExNDUsIDExNDYsIDExNDksIDExNTEsIDExNjApKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBgQWxsZSBOw6ZyaW5nZXJgLCAoYW5nbGU9MCkpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArDQogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKw0KICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0IiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBobGRfYm9zX2xvbmd9DQpobGRfYm9zX2xvbmcgPC0gc3lzc2VsX2JvcyAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBgQWxsZSBOw6ZyaW5nZXJgOlVvcHBnaXR0LA0KICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLA0KICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhdWdhbGFuZGV0XzNfU3TDuHJzdGVfQm9zdGVkfQ0KaGxkX2Jvc19sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiVmluZGFmam9yZCIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4geDogSGF1Z2FsYW5kZXQ6IEhhdWdlc3VuZCwgS2FybcO4eSBvZyBWaW5kYWZqb3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdfVG90YWxfSGF1Z2FsYW5kZXRfNF9NaW5zdGVfQm9zdGVkfQ0KaGxkX2Jvc19sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQm9rbiIsICJTYXVkYSIsICJUeXN2w6ZyIiwgIlV0c2lyYSIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4geDogSGF1Z2FsYW5kZXQ6IEJva24sIFNhdWRhIFR5c3bDpnIgb2cgVXRzaXJhIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19IYXVnZWxhbmRldF8zX1N0w7hyc3RlX0Jvc3RlZH0NCmhsZF9ib3NfbG9uZyAlPiUgDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkhhdWdlc3VuZCIsICJLYXJtw7h5IiwgIlZpbmRhZmpvcmQiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICBsYWJzKHRpdGxlID0gIkhhdWdhbGFuZGV0OiBIYXVnZXN1bmQsIEthcm3DuHkgb2cgVmluZGFmam9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfNF9NaW5zdGVfQm9zdGVkfQ0KaGxkX2Jvc19sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQm9rbiIsICJTYXVkYSIsICJUeXN2w6ZyIiwgIlV0c2lyYSIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIGxhYnModGl0bGUgPSAiSGF1Z2FsYW5kZXQ6IEJva24sIFNhdWRhLCBUeXN2w6ZyIG9nIFV0c2lyYSIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQojIyBTdW5uaG9yZGxhbmQNCg0KYGBge3IgQm9zdGVkX1N1bm5ob3JkbGFuZF8xfQ0Kc3VuX2JvcyAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiU3VubmhvcmRhbGFuZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkNCmBgYA0KDQpgYGB7ciBCb3N0ZWRfU3VubmhvcmRsYW5kXzJ9DQpzeXNzZWxfYm9zICU+JSANCiAgZmlsdGVyKGtuciAlaW4lIGMoNDYxMSwgNDYxMiwgNDYxMywgNDYxNCwgNDYxNSwgNDYxNiwgNDYxNykpICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArDQogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpICsNCiAgIGxhYnModGl0bGUgPSAiU3VubmhvcmRsYW5kIiwgeCA9ICLDhXIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIHN1bl9ib3NfbG9uZ30NCnN1bl9ib3NfbG9uZyA8LSBzeXNzZWxfYm9zICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsDQogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsDQogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzNfU3TDuHJzdGVfQm9zdGVkfQ0Kc3VuX2Jvc19sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQsO4bWxvIiwgIkt2aW5uaGVyYWQiLCAiU3RvcmQiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsNCiAgbGFicyh0aXRsZSA9ICJGaWcuIHg6IFN1bm5ob3JkbGFuZDogQsO4bWxvLCBLdmlubmhlcmFkIG9nIFN0b3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzRfTWluc3RlX0Jvc3RlZH0NCnN1bl9ib3NfbG9uZyAlPiUgDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIkV0bmUiLCAiRml0amFyIiwgIlN2ZWlvIiwgIlR5c25lcyIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKw0KICBsYWJzKHRpdGxlID0gIkZpZy4geDogU3VubmhvcmRsYW5kOiBFdG5lLCBGaXRoYXIsIFN2ZWlvIG9nIFR5c25lcyIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfU3VubmhvcmRsYW5kXzNfU3TDuHJzdGVfQm9zdGVkfQ0Kc3VuX2Jvc19sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQsO4bWxvIiwgIlN0b3JkIiwgIkt2aW5uaGVyYWQiKSkgJT4lIA0KICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICBsYWJzKHRpdGxlID0gIlN1bm5ob3JkbGFuZDogQsO4bWxvLCBLdmlubmhlcmFkIG9nIFN0b3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfNF9NaW5zdGVfQm9zdGVkfQ0Kc3VuX2Jvc19sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiRXRuZSIsICJTdmVpbyIsICJGaXRqYXIiLCAiVHlzbmVzIikpICU+JSANCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsNCiAgbGFicyh0aXRsZSA9ICJTdW5uaG9yZGxhbmQ6IEV0bmUsIEZpdGphciwgU3ZlaW8gb2cgVHlzbmVzIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCiMjIEhhcmRhbmdlcg0KDQpgYGB7ciBCb3N0ZWRfSGFyZGFuZ2VyXzF9DQpoYXJfYm9zICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXIiLCB5PSAiQWxsZSBOw6ZyaW5nZXIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpDQpgYGANCg0KYGBge3IgQm9zdGVkX0hhcmRhbmdlcl8yfQ0Kc3lzc2VsX2JvcyAlPiUgDQogIGZpbHRlcihrbnIgJWluJSBjKDQ2MTgsIDEyMjgpKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsNCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhzZXEoMi4wLCAyLCBieSA9IC0wLjEpKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKw0KICAgbGFicyh0aXRsZSA9ICJIYXJkYW5nZXIiLCB4ID0gIsOFciIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQpgYGANCg0KYGBge3IgaGFyX2Jvc19sb25nfQ0KaGFyX2Jvc19sb25nIDwtIHN5c3NlbF9ib3MgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYEFsbGUgTsOmcmluZ2VyYDpVb3BwZ2l0dCwNCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwNCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpDQpgYGANCg0KYGBge3IgTsOmcmluZ19Ub3RhbF9IYXJkYW5nZXJfQm9zdGVkfQ0KaGFyX2Jvc19sb25nICU+JSANCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiT2RkYSIsICJVbGxlbnN2YW5nIikpICU+JSANCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArDQogIGxhYnModGl0bGUgPSAiRmlnLiB4OiBIYXJkYW5nZXI6IE9kZGEgb2cgVWxsZW5zdmFuZyIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCmBgYA0KDQpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGFyZGFuZ2VyX0Jvc3RlZH0NCmhhcl9ib3NfbG9uZyAlPiUgDQogIGZpbHRlcihrbmF2biAlaW4lIGMoIk9kZGEiLCAiVWxsZW5zdmFuZyIpKSAlPiUgDQogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSANCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIGxhYnModGl0bGUgPSAiSGFyZGFuZ2VyOiBPZGRhLCBVbGxlbnN2YW5nIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KYGBgDQoNCiMgMy4xIExva2FsaXNlcmluZ3Nrdm90aWVudGVyIChWZW50ZXIgcMOlIHN2YXIgZnLDpSBJbmdlIGFuZy4gR0lOSS12ZXJkaWFyLikNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCm5hc2pvbmFsdF9hcmJlaWRzc3RlZCA8LSByZWFkX2V4Y2VsKCJEYXRhL25hc2pvbmFsdF9hcmJlaWRzc3RlZC54bHN4IikNCmBgYA0KDQojIyBMb2thbGlzZXJpbmdza3ZvdGllbnRlciBmb3IgcmVnaW9uZW5lIHNhbWxldCAoTcOlIHRpbCBsaXR0IG1laXIgYXJiZWlkIGVuZG8pDQoNCiMjIyBIYXVnYWxhbmRldCAyMDA4LTIwMjANCg0KLSBFaXJfRXJfSm9yZGJydWsgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpIHJlZ2lvbiBIYXVnYWxhbmRldA0KLSBFaXJfRXJfSW5kdXN0cmkgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBJbmR1c3RyaS1zZWt0b3JlbiBpIHJlZ2lvbiBIYXVnYWxhbmRldA0KLSBFaXJfRXJfRWxfVmFubl9SZW5vID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRWxla2V0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uLXNla3RvcmVuIGkgcmVnaW9uIEhhdWdhbGFuZGV0DQotIEVpcl9Fcl9CeWdnX29nX0FubGVnZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldC1zZWt0b3JlbiBpIHJlZ2lvbiBIYXVnYWxhbmRldA0KLSBFaXJfRXJfRmluYW5zID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRmluYW5zaWVyaW5nIG9nIEZvcnNpa3Jpbmctc2VrdG9yZW4gaSByZWdpb24gSGF1Z2FsYW5kZXQNCi0gRWlyX0VyX1VuZGVydmlzbmluZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIFVuZGVydmlzbmluZy1zZWt0b3JlbiBpIHJlZ2lvbiBIYXVnYWxhbmRldA0KLSBFaXJfRXJfSGVsc2UgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyLXNla3RvcmVuIGkgcmVnaW9uIEhhdWdhbGFuZGV0DQoNCmBgYHtyIGhsZF9pbmR1c3RyaX0NCmhsZF9hcmJfTFEgPC0gaGxkX2FyYiAlPiUgDQogICMgU2xpayBmaW5uZXIgdmkgc2FtbGV0IHN5c3NlbHNldHRpbmcgaSBJbmR1c3RyaSBpIEhhdWdlbGFuZGV0IGZvciDDpXIgMjAwOC0yMDIwDQogIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9FbF9WYW5uX1Jlbm8gPSBgRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb25gL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9GaW5hbnMgPSBgRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmdgL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfVW5kZXJ2aXNuaW5nID0gVW5kZXJ2aXNuaW5nL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkgJT4lIA0KICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfSm9yZGJydWssIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0VsX1Zhbm5fUmVubywgRWlyX0VyX0J5Z2dfb2dfQW5sZWdnLCBFaXJfRXJfRmluYW5zLCBFaXJfRXJfVW5kZXJ2aXNuaW5nLCBFaXJfRXJfSGVsc2UpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikNCmBgYA0KDQpgYGB7cn0NCmthYmxlKGhsZF9hcmJfTFEsDQogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJKb3JkYnJ1ayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbm4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ5Z2ciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmFucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZXJ2LiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiTG9rYWxrdm90aWVudCwgcmVnaW9uOiBIYXVnYWxhbmRldCI9OSkpDQpgYGANCg0KYGBge3J9DQpobGRfYXJiX0dJTkkgPC0gaGxkX2FyYiAlPiUgDQogIG11dGF0ZSgNCiAgICBHSU5JX1ByaW3DpnIgPSAoKGhsZF9hcmIkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gaGxkX2FyYiRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwNCiAgICANCiAgICBHSU5JX0luZHVzdHJpID0gKChobGRfYXJiJEluZHVzdHJpL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAtIGhsZF9hcmIkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9IZWxzZSA9ICgoaGxkX2FyYiRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIGhsZF9hcmIkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpDQpgYGANCg0KYGBge3J9DQpobGRfYXJiX0dJTkkgPC0gaGxkX2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIFJESV9Qcmltw6ZyID0gMSAvIGhsZF9hcmIkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBobGRfYXJiJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gaGxkX2FyYiRJbmR1c3RyaSAvIGhsZF9hcmIkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBobGRfYXJiJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9obGRfYXJiJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSAlPiUgDQogIA0KICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQ0KYGBgDQoNCmBgYHtyfQ0Ka2FibGUoaGxkX2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiSGF1Z2FsYW5kZXQiPTgpKQ0KYGBgDQoNCiMjIyMgS29tbXVuZW5pdsOlIHDDpSBIYXVnYWxhbmRldCAoSGF1Z2VzdW5kLCBLYXJtw7h5LCBUeXN2w6ZyIG9nIEJva24pDQoNCiMjIyMjIEhhdWdlc3VuZA0KDQpgYGB7cn0NCkhhdWdfYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSAiMTEwNiIpDQpgYGANCg0KYGBge3J9DQpuYW1lcyhIYXVnX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiDQpgYGANCg0KYGBge3J9DQpIYXVnX2FyYl9HSU5JIDwtIEhhdWdfYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChIYXVnX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIEhhdWdfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9JbmR1c3RyaSA9ICgoSGF1Z19hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBIYXVnX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSGVsc2UgPSAoKEhhdWdfYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBIYXVnX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0KSGF1Z19hcmJfR0lOSSA8LSBIYXVnX2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIFJESV9Qcmltw6ZyID0gMSAvIEhhdWdfYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBIYXVnX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gSGF1Z19hcmJfR0lOSSRJbmR1c3RyaSAvIEhhdWdfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBIYXVnX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9IYXVnX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSAlPiUgDQogIA0KICBzZWxlY3Qoa25yLCDDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShIYXVnX2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIktuciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MywgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkhhdWdlc3VuZCI9OSkpDQpgYGANCg0KIyMjIyMgQm9rbg0KDQpgYGB7cn0NCkJva25fYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSAiMTE0NSIpDQpgYGANCg0KYGBge3J9DQpuYW1lcyhCb2tuX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiDQpgYGANCg0KYGBge3J9DQpCb2tuX2FyYl9HSU5JIDwtIEJva25fYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChCb2tuX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIEJva25fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9JbmR1c3RyaSA9ICgoQm9rbl9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBCb2tuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSGVsc2UgPSAoKEJva25fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBCb2tuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0KQm9rbl9hcmJfR0lOSSA8LSBCb2tuX2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIFJESV9Qcmltw6ZyID0gMSAvIEJva25fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBCb2tuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gQm9rbl9hcmJfR0lOSSRJbmR1c3RyaSAvIEJva25fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBCb2tuX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9Cb2tuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSAlPiUgDQogIA0KICBzZWxlY3Qoa25yLCDDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShCb2tuX2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIktuciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0zLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiQm9rbiI9OSkpDQpgYGANCg0KIyMjIyMgVHlzdsOmcg0KDQpgYGB7cn0NClR5c3ZfYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSAiMTE0NiIpDQpgYGANCg0KYGBge3J9DQpuYW1lcyhUeXN2X2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiDQpgYGANCg0KYGBge3J9DQpUeXN2X2FyYl9HSU5JIDwtIFR5c3ZfYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChUeXN2X2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIFR5c3ZfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9JbmR1c3RyaSA9ICgoVHlzdl9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBUeXN2X2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSGVsc2UgPSAoKFR5c3ZfYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBUeXN2X2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0KVHlzdl9hcmJfR0lOSSA8LSBUeXN2X2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIFJESV9Qcmltw6ZyID0gMSAvIFR5c3ZfYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBUeXN2X2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gVHlzdl9hcmJfR0lOSSRJbmR1c3RyaSAvIFR5c3ZfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBUeXN2X2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9UeXN2X2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSAlPiUgDQogIA0KICBzZWxlY3Qoa25yLCDDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShUeXN2X2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIktuciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0zLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiVHlzdsOmciI9OSkpDQpgYGANCg0KIyMjIyMgS2FybcO4eQ0KDQpgYGB7cn0NCkthcm1fYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSAiMTE0OSIpDQpgYGANCg0KYGBge3J9DQpuYW1lcyhLYXJtX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiDQpgYGANCg0KYGBge3J9DQpLYXJtX2FyYl9HSU5JIDwtIEthcm1fYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChLYXJtX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIEthcm1fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9JbmR1c3RyaSA9ICgoS2FybV9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBLYXJtX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSGVsc2UgPSAoKEthcm1fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBLYXJtX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0KS2FybV9hcmJfR0lOSSA8LSBLYXJtX2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIFJESV9Qcmltw6ZyID0gMSAvIEthcm1fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBLYXJtX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gS2FybV9hcmJfR0lOSSRJbmR1c3RyaSAvIEthcm1fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBLYXJtX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9LYXJtX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSAlPiUgDQogIA0KICBzZWxlY3Qoa25yLCDDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShLYXJtX2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIktuciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0zLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiS2FybcO4eSI9OSkpDQpgYGANCg0KDQojIyMgU3VubmhvcmRsYW5kIDIwMDgtMjAyMA0KDQotIEVpcl9Fcl9Kb3JkYnJ1ayA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGkgcmVnaW9uIFN1bm5ob3JkbGFuZA0KLSBFaXJfRXJfSW5kdXN0cmkgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBJbmR1c3RyaS1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQNCi0gRWlyX0VyX0VsX1Zhbm5fUmVubyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEVsZWtldHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbi1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQNCi0gRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0LXNla3RvcmVuIGkgcmVnaW9uIFN1bm5ob3JkbGFuZA0KLSBFaXJfRXJfRmluYW5zID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRmluYW5zaWVyaW5nIG9nIEZvcnNpa3Jpbmctc2VrdG9yZW4gaSByZWdpb24gU3VubmhvcmRsYW5kDQotIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBVbmRlcnZpc25pbmctc2VrdG9yZW4gaSByZWdpb24gU3VubmhvcmRsYW5kDQotIEVpcl9Fcl9IZWxzZSA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXItc2VrdG9yZW4gaSByZWdpb24gU3VubmhvcmRsYW5kDQoNCmBgYHtyIHN1bl9pbmR1c3RyaX0NCnN1bl9hcmJfTFEgPC0gc3VuX2FyYiAlPiUgDQogICMgU2xpayBmaW5uZXIgdmkgc2FtbGV0IHN5c3NlbHNldHRpbmcgaSBJbmR1c3RyaSBpIFN1bm5ob3JkbGFuZCBmb3Igw6VyIDIwMDgtMjAyMA0KICBtdXRhdGUoRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gYEJ5Z2dlLSBvZyBBbm5sZWdnc3Zpcmtzb21oZXRgL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfRmluYW5zID0gYEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApICU+JSANCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX0pvcmRicnVrLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9FbF9WYW5uX1Jlbm8sIEVpcl9Fcl9CeWdnX29nX0FubGVnZywgRWlyX0VyX0ZpbmFucywgRWlyX0VyX1VuZGVydmlzbmluZywgRWlyX0VyX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShzdW5fYXJiX0xRLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSm9yZGJydWsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYW5uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeWdnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaW5hbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVydi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkxva2Fsa3ZvdGllbnRlbiwgcmVnaW9uOiBTdW5uaG9yZGxhbmQiPTkpKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VuX2FyYl9HSU5JIDwtIHN1bl9hcmIgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChzdW5fYXJiJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIHN1bl9hcmIkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9JbmR1c3RyaSA9ICgoc3VuX2FyYiRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBzdW5fYXJiJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSGVsc2UgPSAoKHN1bl9hcmIkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBzdW5fYXJiJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VuX2FyYl9HSU5JIDwtIHN1bl9hcmJfR0lOSSAlPiUgDQogIG11dGF0ZSgNCiAgICBSRElfUHJpbcOmciA9IDEgLyBzdW5fYXJiJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gc3VuX2FyYiRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsDQogICAgUkRJX0luZHVzdHJpID0gMSAvIHN1bl9hcmIkSW5kdXN0cmkgLyBzdW5fYXJiJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICBSRElfSGVsc2UgPSAxIC8gc3VuX2FyYiRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvc3VuX2FyYiRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkgJT4lIA0KICANCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikNCmBgYA0KDQpgYGB7cn0NCmthYmxlKHN1bl9hcmJfR0lOSSwNCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSANCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJSZWdpb246IFN1bm5ob3JkbGFuZCI9OCkpDQpgYGANCg0KIyMjIyBLb21tdW5lbml2w6UgaSBTdW5uaG9yZGxhbmQgKFN0b3JkLCBLdmlubmhlcmFkLCBCw7htbG8gb2cgU3ZlaW8pDQoNCiMjIyMjIFN0b3JkDQoNCmBgYHtyfQ0KU3RvcmRfYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSAiNDYxNCIpDQpgYGANCg0KYGBge3J9DQpuYW1lcyhTdG9yZF9hcmJfR0lOSSlbWzVdXSA8LSAiw4VyIg0KYGBgDQoNCmBgYHtyfQ0KU3RvcmRfYXJiX0dJTkkgPC0gU3RvcmRfYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChTdG9yZF9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBTdG9yZF9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwNCiAgICANCiAgICBHSU5JX0luZHVzdHJpID0gKChTdG9yZF9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBTdG9yZF9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwNCiAgICANCiAgICBHSU5JX0hlbHNlID0gKChTdG9yZF9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIFN0b3JkX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0KU3RvcmRfYXJiX0dJTkkgPC0gU3RvcmRfYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgUkRJX1ByaW3DpnIgPSAxIC8gU3RvcmRfYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBTdG9yZF9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsDQogICAgDQogICAgUkRJX0luZHVzdHJpID0gMSAvIFN0b3JkX2FyYl9HSU5JJEluZHVzdHJpIC8gU3RvcmRfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBTdG9yZF9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvU3RvcmRfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApICU+JSANCiAgDQogIHNlbGVjdChrbnIsIMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikNCmBgYA0KDQpgYGB7cn0NCmthYmxlKFN0b3JkX2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIktuciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0zLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiU3RvcmQiPTkpKQ0KYGBgDQoNCiMjIyMjIEt2aW5uaGVyYWQNCg0KYGBge3J9DQpLdmlubl9hcmJfR0lOSSA8LSBzeXNzZWxfYXJiICU+JSANCiAgZmlsdGVyKGtuciAlaW4lICI0NjE3IikNCmBgYA0KDQpgYGB7cn0NCm5hbWVzKEt2aW5uX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiDQpgYGANCg0KYGBge3J9DQpLdmlubl9hcmJfR0lOSSA8LSBLdmlubl9hcmJfR0lOSSAlPiUgDQogIG11dGF0ZSgNCiAgICBHSU5JX1ByaW3DpnIgPSAoKEt2aW5uX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIEt2aW5uX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSW5kdXN0cmkgPSAoKEt2aW5uX2FyYl9HSU5JJEluZHVzdHJpL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAtIEt2aW5uX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSGVsc2UgPSAoKEt2aW5uX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gS3Zpbm5fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpDQpgYGANCg0KYGBge3J9DQpLdmlubl9hcmJfR0lOSSA8LSBLdmlubl9hcmJfR0lOSSAlPiUgDQogIG11dGF0ZSgNCiAgICBSRElfUHJpbcOmciA9IDEgLyBLdmlubl9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIEt2aW5uX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gS3Zpbm5fYXJiX0dJTkkkSW5kdXN0cmkgLyBLdmlubl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsDQogICAgDQogICAgUkRJX0hlbHNlID0gMSAvIEt2aW5uX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9Ldmlubl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkgJT4lIA0KICANCiAgc2VsZWN0KGtuciwgw4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQ0KYGBgDQoNCmBgYHtyfQ0Ka2FibGUoS3Zpbm5fYXJiX0dJTkksDQogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiS25yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICLDhXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTMsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSANCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJLdmlubmhlcmFkIj05KSkNCmBgYA0KDQojIyMjIyBCw7htbG8NCg0KYGBge3J9DQpCw7htbG9fYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSAiNDYxMyIpDQpgYGANCg0KYGBge3J9DQpuYW1lcyhCw7htbG9fYXJiX0dJTkkpW1s1XV0gPC0gIsOFciINCmBgYA0KDQpgYGB7cn0NCkLDuG1sb19hcmJfR0lOSSA8LSBCw7htbG9fYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChCw7htbG9fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gQsO4bWxvX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSW5kdXN0cmkgPSAoKELDuG1sb19hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBCw7htbG9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9IZWxzZSA9ICgoQsO4bWxvX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gQsO4bWxvX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0KQsO4bWxvX2FyYl9HSU5JIDwtIELDuG1sb19hcmJfR0lOSSAlPiUgDQogIG11dGF0ZSgNCiAgICBSRElfUHJpbcOmciA9IDEgLyBCw7htbG9fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBCw7htbG9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9JbmR1c3RyaSA9IDEgLyBCw7htbG9fYXJiX0dJTkkkSW5kdXN0cmkgLyBCw7htbG9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBCw7htbG9fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL0LDuG1sb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkgJT4lIA0KICANCiAgc2VsZWN0KGtuciwgw4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQ0KYGBgDQoNCmBgYHtyfQ0Ka2FibGUoQsO4bWxvX2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIktuciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0zLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiQsO4bWxvIj05KSkNCmBgYA0KDQojIyMjIyBTdmVpbw0KDQpgYGB7cn0NClN2ZWlvX2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIA0KICBmaWx0ZXIoa25yICVpbiUgIjQ2MTIiKQ0KYGBgDQoNCmBgYHtyfQ0KbmFtZXMoU3ZlaW9fYXJiX0dJTkkpW1s1XV0gPC0gIsOFciINCmBgYA0KDQpgYGB7cn0NClN2ZWlvX2FyYl9HSU5JIDwtIFN2ZWlvX2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIEdJTklfUHJpbcOmciA9ICgoU3ZlaW9fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gU3ZlaW9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9JbmR1c3RyaSA9ICgoU3ZlaW9fYXJiX0dJTkkkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC0gU3ZlaW9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9IZWxzZSA9ICgoU3ZlaW9fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBTdmVpb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkNCmBgYA0KDQpgYGB7cn0NClN2ZWlvX2FyYl9HSU5JIDwtIFN2ZWlvX2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIFJESV9Qcmltw6ZyID0gMSAvIFN2ZWlvX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgIC8gU3ZlaW9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9JbmR1c3RyaSA9IDEgLyBTdmVpb19hcmJfR0lOSSRJbmR1c3RyaSAvIFN2ZWlvX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSGVsc2UgPSAxIC8gU3ZlaW9fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL1N2ZWlvX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQ0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSAlPiUgDQogIA0KICBzZWxlY3Qoa25yLCDDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShTdmVpb19hcmJfR0lOSSwNCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCJLbnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIsOFciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MywgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlN2ZWlvIj05KSkNCmBgYA0KDQojIyMgSGFyZGFuZ2VyIDIwMDgtMjAyMA0KDQotIEVpcl9Fcl9Kb3JkYnJ1ayA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGkgcmVnaW9uIEhhcmRhbmdlcg0KLSBFaXJfRXJfSW5kdXN0cmkgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBJbmR1c3RyaS1zZWt0b3JlbiBpIHJlZ2lvbiBIYXJkYW5nZXINCi0gRWlyX0VyX0VsX1Zhbm5fUmVubyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEVsZWtldHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbi1zZWt0b3JlbiBpIHJlZ2lvbiBIYXJkYW5nZXINCi0gRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0LXNla3RvcmVuIGkgcmVnaW9uIEhhcmRhbmdlcg0KLSBFaXJfRXJfRmluYW5zID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRmluYW5zaWVyaW5nIG9nIEZvcnNpa3Jpbmctc2VrdG9yZW4gaSByZWdpb24gSGFyZGFuZ2VyDQotIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBVbmRlcnZpc25pbmctc2VrdG9yZW4gaSByZWdpb24gSGFyZGFuZ2VyDQotIEVpcl9Fcl9IZWxzZSA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXItc2VrdG9yZW4gaSByZWdpb24gSGFyZGFuZ2VyDQoNCmBgYHtyIGhhcl9pbmR1c3RyaX0NCmhhcl9hcmJfTFEgPC0gaGFyX2FyYiAlPiUgDQogICMgU2xpayBmaW5uZXIgdmkgc2FtbGV0IHN5c3NlbHNldHRpbmcgaSBJbmR1c3RyaSBpIEhhcmRhbmdlciBmb3Igw6VyIDIwMDgtMjAyMA0KICBtdXRhdGUoRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gYEJ5Z2dlLSBvZyBBbm5sZWdnc3Zpcmtzb21oZXRgL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfRmluYW5zID0gYEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmApICU+JSANCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX0pvcmRicnVrLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9FbF9WYW5uX1Jlbm8sIEVpcl9Fcl9CeWdnX29nX0FubGVnZywgRWlyX0VyX0ZpbmFucywgRWlyX0VyX1VuZGVydmlzbmluZywgRWlyX0VyX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShoYXJfYXJiX0xRLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSm9yZGJydWsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYW5uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeWdnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaW5hbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVydi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkxva2Fsa3ZvdGllbnQsIHJlZ2lvbjogSGFyZGFuZ2VyIj05KSkNCmBgYA0KDQpgYGB7cn0NCmhhcl9hcmJfR0lOSSA8LSBoYXJfYXJiICU+JSANCiAgbXV0YXRlKA0KICAgIEdJTklfUHJpbcOmciA9ICgoaGFyX2FyYiRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBoYXJfYXJiJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLA0KICAgIA0KICAgIEdJTklfSW5kdXN0cmkgPSAoKGhhcl9hcmIkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC0gaGFyX2FyYiRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwNCiAgICANCiAgICBHSU5JX0hlbHNlID0gKChoYXJfYXJiJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gaGFyX2FyYiRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkNCmBgYA0KDQpgYGB7cn0NCmhhcl9hcmJfR0lOSSA8LSBoYXJfYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgUkRJX1ByaW3DpnIgPSAxIC8gaGFyX2FyYiRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIGhhcl9hcmIkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIFJESV9JbmR1c3RyaSA9IDEgLyBoYXJfYXJiJEluZHVzdHJpIC8gaGFyX2FyYiRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsDQogICAgUkRJX0hlbHNlID0gMSAvIGhhcl9hcmIkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2hhcl9hcmIkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApICAlPiUNCiAgDQogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpDQpgYGANCg0KYGBge3J9DQprYWJsZShoYXJfYXJiX0dJTkksDQogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiUmVnaW9uOiBIYXJkYW5nZXIiPTgpKQ0KYGBgDQoNCiMjIyMgS29tbXVuZW5pdsOlIGkgSGFyZGFuZ2VyIChPZGRhIG9nIFVsbGVuc3ZhbmcpDQoNCiMjIyMjIE9kZGENCg0KYGBge3J9DQpuYXNqb19hcmJfcmVkIDwtIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCAlPiUgDQogIGZpbHRlcihhYXIgJWluJSBjKDIwMDg6MjAxOSkpDQpgYGANCg0KYGBge3J9DQpPZGRhX2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIA0KICBmaWx0ZXIoa25yICVpbiUgIjEyMjgiKQ0KYGBgDQoNCmBgYHtyfQ0KbmFtZXMoT2RkYV9hcmJfR0lOSSlbWzVdXSA8LSAiw4VyIg0KYGBgDQoNCmBgYHtyfQ0KT2RkYV9hcmJfR0lOSSA8LSBPZGRhX2FyYl9HSU5JICU+JSANCiAgbXV0YXRlKA0KICAgIEdJTklfUHJpbcOmciA9ICgoT2RkYV9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb19hcmJfcmVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gT2RkYV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvX2FyYl9yZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9JbmR1c3RyaSA9ICgoT2RkYV9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb19hcmJfcmVkJEluZHVzdHJpIC0gT2RkYV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvX2FyYl9yZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksDQogICAgDQogICAgR0lOSV9IZWxzZSA9ICgoT2RkYV9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9fYXJiX3JlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBPZGRhX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9fYXJiX3JlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkNCmBgYA0KDQpgYGB7cn0NCk9kZGFfYXJiX0dJTkkgPC0gT2RkYV9hcmJfR0lOSSAlPiUgDQogIG11dGF0ZSgNCiAgICBSRElfUHJpbcOmciA9IDEgLyBPZGRhX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgIC8gT2RkYV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9fYXJiX3JlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvX2FyYl9yZWQkYEFsbGUgTsOmcmluZ2VyYCwNCiAgICANCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gT2RkYV9hcmJfR0lOSSRJbmR1c3RyaSAvIE9kZGFfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvX2FyYl9yZWQkSW5kdXN0cmkgLyBuYXNqb19hcmJfcmVkJGBBbGxlIE7DpnJpbmdlcmAsDQogICAgDQogICAgUkRJX0hlbHNlID0gMSAvIE9kZGFfYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL09kZGFfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvX2FyYl9yZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvX2FyYl9yZWQkYEFsbGUgTsOmcmluZ2VyYCkgJT4lIA0KICANCiAgc2VsZWN0KGtuciwgw4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQ0KYGBgDQoNCmBgYHtyfQ0Ka2FibGUoT2RkYV9hcmJfR0lOSSwNCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCJLbnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIsOFciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MywgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIk9kZGEoLTIwMTkpIj05KSkNCmBgYA0KDQojIyMjIyBVbGxlbnN2YW5nDQoNCmBgYHtyfQ0KVWxsZW5fYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgDQogIGZpbHRlcihrbnIgJWluJSAiNDYxOCIpDQpgYGANCg0KYGBge3J9DQpuYW1lcyhVbGxlbl9hcmJfR0lOSSlbWzVdXSA8LSAiw4VyIg0KYGBgDQoNCmBgYHtyfQ0KVWxsZW5fYXJiX0dJTkkgPC0gVWxsZW5fYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgR0lOSV9Qcmltw6ZyID0gKChVbGxlbl9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBVbGxlbl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwNCiAgICANCiAgICBHSU5JX0luZHVzdHJpID0gKChVbGxlbl9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBVbGxlbl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwNCiAgICANCiAgICBHSU5JX0hlbHNlID0gKChVbGxlbl9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIFVsbGVuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQ0KYGBgDQoNCmBgYHtyfQ0KVWxsZW5fYXJiX0dJTkkgPC0gVWxsZW5fYXJiX0dJTkkgJT4lIA0KICBtdXRhdGUoDQogICAgUkRJX1ByaW3DpnIgPSAxIC8gVWxsZW5fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBVbGxlbl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0NCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsDQogICAgDQogICAgUkRJX0luZHVzdHJpID0gMSAvIFVsbGVuX2FyYl9HSU5JJEluZHVzdHJpIC8gVWxsZW5fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLA0KICAgIA0KICAgIFJESV9IZWxzZSA9IDEgLyBVbGxlbl9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvVWxsZW5fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtDQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApICU+JSANCiAgDQogIHNlbGVjdChrbnIsIMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikNCmBgYA0KDQpgYGB7cn0NCmthYmxlKFVsbGVuX2FyYl9HSU5JLA0KICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIktuciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiw4VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0zLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiVWxsZW5zdmFuZyI9OSkpDQpgYGANCg0KIyMgTmFzam9uYWx0Pz8NCg0KYGBge3J9DQpzeXNzZWxfYXJiIDwtIHN5c3NlbF9hcmIgJT4lIA0KICBtdXRhdGUoRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gYEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpcl9Fcl9GaW5hbnMgPSBgRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmdgL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfVW5kZXJ2aXNuaW5nID0gVW5kZXJ2aXNuaW5nL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkNCmBgYA0KDQpgYGB7cn0NCm5hc2pvbmFsdF9hcmJlaWRzc3RlZCA8LSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQgJT4lIA0KICBtdXRhdGUoRWluX0VuX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpbl9Fbl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaW5fRW5fRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLA0KICAgICAgICAgRWluX0VuX0J5Z2dfb2dfQW5sZWdnID0gYEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwNCiAgICAgICAgIEVpbl9Fbl9GaW5hbnMgPSBgRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmdgL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaW5fRW5fVW5kZXJ2aXNuaW5nID0gVW5kZXJ2aXNuaW5nL2BBbGxlIE7DpnJpbmdlcmAsDQogICAgICAgICBFaW5fRW5fSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkNCg0KDQpMUV9hcmJfSm9yZGJydWsgPC0gc3lzc2VsX2FyYiAlPiUgDQogIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfSm9yZGJydWspICU+JSANCiAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgDQogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0pvcmRicnVrKSwgYnkgPSBjKCJhYXIiKSkgJT4lIA0KICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfSm9yZGJydWsvRWluX0VuX0pvcmRicnVrKQ0KDQoNCkxRX2FyYl9JbmR1c3RyaSA8LSBzeXNzZWxfYXJiICU+JSANCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9JbmR1c3RyaSkgJT4lIA0KICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSANCiAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCwgYWFyLCBFaW5fRW5fSW5kdXN0cmkpLCBieSA9IGMoImFhciIpKSAlPiUgDQogIG11dGF0ZShhbmRlbCA9IEVpcl9Fcl9JbmR1c3RyaS9FaW5fRW5fSW5kdXN0cmkpDQoNCg0KTFFfYXJiX0VsX1Zhbm5fUmVubyA8LSBzeXNzZWxfYXJiICU+JSANCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9FbF9WYW5uX1Jlbm8pICU+JSANCiAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgDQogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0VsX1Zhbm5fUmVubyksIGJ5ID0gYygiYWFyIikpICU+JSANCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX0VsX1Zhbm5fUmVuby9FaW5fRW5fRWxfVmFubl9SZW5vKQ0KDQoNCkxRX2FyYl9CeWdnX0FubGVnZyA8LSBzeXNzZWxfYXJiICU+JSANCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9CeWdnX29nX0FubGVnZykgJT4lIA0KICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSANCiAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCwgYWFyLCBFaW5fRW5fQnlnZ19vZ19BbmxlZ2cpLCBieSA9IGMoImFhciIpKSAlPiUgDQogIG11dGF0ZShhbmRlbCA9IEVpcl9Fcl9CeWdnX29nX0FubGVnZy9FaW5fRW5fQnlnZ19vZ19BbmxlZ2cpDQoNCg0KTFFfYXJiX0ZpbmFucyA8LSBzeXNzZWxfYXJiICU+JSANCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9GaW5hbnMpICU+JSANCiAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgDQogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0ZpbmFucyksIGJ5ID0gYygiYWFyIikpICU+JSANCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX0ZpbmFucy9FaW5fRW5fRmluYW5zKQ0KDQoNCkxRX2FyYl9VbmRlcnZpc25pbmcgPC0gc3lzc2VsX2FyYiAlPiUgDQogIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfVW5kZXJ2aXNuaW5nKSAlPiUgDQogIG11dGF0ZShhYXIgPSBhcy5jaGFyYWN0ZXIoYWFyKSkgJT4lIA0KICBsZWZ0X2pvaW4oc2VsZWN0KC5kYXRhID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkLCBhYXIsIEVpbl9Fbl9VbmRlcnZpc25pbmcpLCBieSA9IGMoImFhciIpKSAlPiUgDQogIG11dGF0ZShhbmRlbCA9IEVpcl9Fcl9VbmRlcnZpc25pbmcvRWluX0VuX1VuZGVydmlzbmluZykNCg0KDQpMUV9hcmJfSGVsc2UgPC0gc3lzc2VsX2FyYiAlPiUgDQogIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfSGVsc2UpICU+JSANCiAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgDQogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0hlbHNlKSwgYnkgPSBjKCJhYXIiKSkgJT4lIA0KICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfSGVsc2UvRWluX0VuX0hlbHNlKQ0KYGBgDQoNCmBgYHtyfQ0Kc3lzc2VsX2FyYiA8LSBzeXNzZWxfYXJiICU+JSANCiAgbXV0YXRlKExRX2FyYl9Kb3JkYnJ1ayA9IExRX2FyYl9Kb3JkYnJ1ayRhbmRlbCwNCiAgICAgICAgIExRX2FyYl9JbmR1c3RyaSA9IExRX2FyYl9JbmR1c3RyaSRhbmRlbCwNCiAgICAgICAgIExRX2FyYl9FbF9WYW5uX1Jlbm8gPSBMUV9hcmJfRWxfVmFubl9SZW5vJGFuZGVsLA0KICAgICAgICAgTFFfYXJiX0J5Z2dfQW5sZWdnID0gTFFfYXJiX0J5Z2dfQW5sZWdnJGFuZGVsLA0KICAgICAgICAgTFFfYXJiX0ZpbmFucyA9IExRX2FyYl9GaW5hbnMkYW5kZWwsDQogICAgICAgICBMUV9hcmJfVW5kZXJ2aXNuaW5nID0gTFFfYXJiX1VuZGVydmlzbmluZyRhbmRlbCwNCiAgICAgICAgIExRX2FyYl9IZWxzZSA9IExRX2FyYl9IZWxzZSRhbmRlbCkNCmBgYA0KDQpgYGB7cn0NCkxRX2FyYiA8LSBzeXNzZWxfYXJiICU+JSANCiAgc2VsZWN0KGFhciwga25hdm4sIExRX2FyYl9Kb3JkYnJ1aywgTFFfYXJiX0luZHVzdHJpLCBMUV9hcmJfRWxfVmFubl9SZW5vLCBMUV9hcmJfQnlnZ19BbmxlZ2csIExRX2FyYl9GaW5hbnMsIExRX2FyYl9VbmRlcnZpc25pbmcsIExRX2FyYl9IZWxzZSkNCmBgYA0KDQpgYGB7cn0NCkxRX2FyYltpcy5uYShMUV9hcmIpXSA9IDANCmBgYA0KDQotDQoNCiMgUGVuZGxpbmcNCg0KRGUgdWxpa2Uga29tbXVuZW5lIG9nIHJlZ2lvbmVuZSBoYXIgdWxpa2UgYmVob3YsIGZvciBhdCByZWdpb25lbmUgc2thbCB1dHZpa2xlIHNlZyBlciBwZW5kbGluZyBldCB2aWt0aWcgYmVncmVwIGZvciDDpSB0aWx0cmVra2Ugc2VnIGFyYmVpZHNrcmFmdC4gVmVsZGlnIG1hbmdlIGtvbW11bmVyIGhhciBmb3IgbGl0ZSBhcmJlaWRzcGxhc3NlciBpIGZvcmhvbGQgdGlsIGFudGFsbCBhcmJlaWRlbmRlIGlubmJ5Z2dlcmUsIHNvbSB2aWwgc2kgYXQgZGUgZmxlc3RlIGVyIGF2aGVuZ2lnZSBhdiBwZW5kbGVyZS4gUGVuZGxpbmcga2FuIHbDpnJlIHRpbCBhbmRyZSBrb21tdW5lciBpIHNhbW1lIHJlZ2lvbiBlbGxlciB0aWwgYW5kcmUgcmVnaW9uZXIuIEFsbGUga29tbXVuZXIgaGFyIGthbnNramUgaWtrZSBhcmJlaWRzcGxhc3NlciBpbm5lbiBhbGxlIGZhZ2ZlbHQsIGFyYmVpZHN0YWtlcmUgZXIgZGVyZm9yIGF2aGVuZ2lnIGF2IMOlIHBlbmRsZXIgdGlsIGFuZHJlIGtvbW11bmVyIGZvciDDpSBmaW5uZSByZWxldmFudCBhcmJlaWQuIERldCBzYW1tZSBnamVsZGVyIGRlcnNvbSBhcmJlaWRzdGFrZXIgaGFyIHRpbGjDuHJpZ2hldCB0aWwgZW4ga29tbXVuZSwgbWVuIGRldCBpa2tlIGZpbm5lcyByZWxldmFudCBhcmJlaWQgZGEgZXIgaGFuIG9nc8OlIG7DuGR0IHRpbCDDpSBzw7hrZSBqb2JiIGkgYW5kcmUga29tbXVuZXIuIEhlciBrb21tZXIgYmVncmVwZW5lIGlubnBlbmRsaW5nIG9nIHV0cGVuZGxpbmcgaW5uLCBzb20gYmV0eXIgYXQgbm9lbiBrb21tdW5lciBlbGxlciByZWdpb25lciBoYXIgZmxlcmUgYXJiZWlkc3BsYXNzZXIgdGlsZ2plbmdlbGlnZSBlbm4gZGUgaGFyIGlubmJ5Z2dlcmUgc29tIGthbiBqb2JiZSBpbm5hZCBpIGtvbW11bmVuIGVsbGVyIGF0IGRlIGlra2UgaGFyIG5vayBhcmJlaWRzcGxhc3NlciBvZyBpbm5ieWdnZXJlbmUgZXIgbsO4ZHQgdGlsIMOlIHPDuGtlIGpvYmIgYW5kcmUgcGxhc3Nlci4gVmkgc2thbCBzZSBww6UgaW5ucGVuZGxpbmcgb2cgdXRwZW5kbGluZyBzb20gdmlsIGt1bm5lIGZvcnRlbGxlIG9zcyBpIGh2aWxrZW4gZ3JhZCBldCBzdGVkIGVyIGludGVncmVydCBpIGV0IHN0w7hycmUgYXJiZWlkc21hcmtlZCBodHRwczovL3JlZ2lvbmFsYW5hbHlzZS5uby9yYXBwb3J0LzMwMDQvMS80LiANCg0KTmVkZW5mb3IgdmlsIHZpIGbDuHJzdCB0YSBmb3Igb3NzIHJlZ2lvbmVuIEhhdWdhbGFuZGV0IG9nIFN1bm5ob3JkbGFuZCBtZWQgVWxsZW5zdmFuZywgb2cgc2UgcMOlIGRpc3NlIHJlZ2lvbmVuZSBodmVyIGZvciBzZWcuIFPDpSBrb21tZXIgZW4gdGFiZWxsIHNvbSB0YXIgZm9yIHNlZyBkaXNzZSByZWdpb25lbmUgc2FtbGV0LiBWaSDDuG5za2VyIGbDuHJzdCDDpSBza2lsbGUgZGlzc2UgdG8gcmVnaW9uZW5lIGZvciDDpSBzZSBpIGh2aWxrZW4ga29tbXVuZSBhbmRlbGVuIGF2IGlubnBlbmRsaW5nIG9nIHV0cGVuZGxpbmcgZXIgc3TDuHJzdCBvZyBtaW5zdC4gRm9yIHPDpSDDpSBzZSBww6UgcGVuZGxpbmdlbiBtZWxsb20gcmVnaW9uZW5lLiANCg0KQWxsZSB0YWJlbGxlbmUgdmlzZXIgDQogDQoNCkhhdWdhbGFuZHNyZWdpb25lbjogDQoNCmBgYHtyIFBlbmRsaW5nIHDDpSBIYXVnYWxhbmRldH0NCmhnbF9QZW5kbGluZw0KYGBgDQpJIHRhYmVsbGVuIG92ZXIgaGFyIHZpIHNldHQgcMOlIEhhdWdhbGFuZHNyZWdpb25lbiBvZyBrb21tdW5lbmUgc29tIGVyIGtueXR0ZXQgdGlsIGRlbm5lIHJlZ2lvbmVuIGVyIEhhdWdlc3VuZCwgU2F1ZGEsIEJva24sIFR5c3bDpnIsIEthcm3DuHksIFV0c2lyYSBvZyBWaW5kYWZqb3JkLiBUYWJlbGxlbiBrYW4gZm9ya2xhcmVzIHDDpSBmw7hsZ2VuZGUgbcOldGU6ICANCg0KSSByYWRlbmUga2FuIHZpIHNlIGlubnBlbmRsaW5nLiBIZXIga2FuIHZpIHNlIGVuIGFuZGVsIHN0aWxsaW5nZXIgc29tIGVyIGJlc2F0dCBhdiBhcmJlaWRzdGFrZXJlIGZyYSBhbmRyZSBrb21tdW5lciBpIEhhdWdhbGFuZHNyZWdpb25lbi4gIA0KDQpJIGtvbG9ubmVuZSBzZXIgdmkgdXRwZW5kbGluZy4gRGV0IHZpbCBzaSBhcmJlaWRzdGFrZXJlIHNvbSBib3IgaSBlbiBrb21tdW5lLCBvZyBzb20gaGFyIGFyYmVpZHN0ZWQgaSBlbiBhbm5lbiBrb21tdW5lIGlubmVuZm9yIEhhdWdsYW5kc3JlZ2lvbmVuLiAgDQoNCkRlIHNvbSBlciBtYXJrZXJ0IG1lZCBndWx0IGVyIGFyYmVpZHN0YWtlcmUgc29tIGJvciBvZyBqb2JiZXIgaSBzYW1tZSBrb21tdW5lLiANCg0KSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFR5c3bDpnIgZXIgZGUga29tbXVuZW5lIGkgcmVnaW9uZW4gbWVkIGjDuHllc3QgYW5kZWwgcGVuZGxlcmUgYsOlZGUgbsOlciBkZXQgZ2plbGRlciBpbm4tIG9nIHV0cGVuZGxpbmcuIExhIG9zcyBzZSBuw6ZybWVyZSBww6UgSGF1Z2VzdW5kIHNvbSBoYXIgZW4gc3RvciBkZWwgYXYgYXJiZWlkc3Rha2VybmUgaSByZWdpb25lbi4gRGV0IGdqZWxkZXIgYsOlZGUgbsOlciB2aSBzZXIgcMOlIGlubnBlbmRsaW5nLCB1dHBlbmRsaW5nIG9nIGRlIHNvbSBib3Igb2cgam9iYmVyIGkgc2FtbWUga29tbXVuZS4gVXQgaWZyYSB0YWJlbGxlbiBrYW4gdmkgc2UgYXQgSGF1Z2VzdW5kIGhhciAxMTcxNCBhcmJlaWRzdGFrZXJlIHNvbSBib3Igb2cgam9iYmVyIGkga29tbXVuZW4uIEZyYSBIYXVnZXN1bmQgZXIgZGV0IGVrc2VtcGVsdmlzIDEwMjkgYXJiZWlkc3Rha2VyZSBzb20gcGVuZGxlciB0aWwgVHlzdsOmciBvZyAyNTg2IGFyYmVpZHN0YWtlcmUgc29tIHBlbmRsZXIgdGlsIEthcm3DuHkuIFRpbCBTYXVkYSBvZyBVdHNpcmEgZXIgZGV0IGVuIGJldHlkZWxpZyBsYXZlcmUgYW5kZWwgc29tIHBlbmRsZXIuIEdydW5uZW4gdGlsIGF0IGRldCBub2sgYXQgZGV0IGVyIG1pbmRyZSBrb21tdW5lciBtZWQgZsOmcnJlIGFyYmVpZHNwbGFzc2VyLiBNYW5nZSBhdiBkZSBzb20gYm9yIGkgZGlzdHJpa3RlbmUgc29tIGVrc2VtcGVsdmlzIFNhdWRhIG9nIFV0c2lyYSBqb2JiZXIgb2cgYm9yIGkgc2FtbWUga29tbXVuZS4gVmkga2FuIHNlIGF0IGkgU2F1ZGEgam9iYmVyIG9nIGJvciBkZXQgMTc4OSBhcmJlaWRzdGFrZXIsIG1lbnMgZGUgaGFyIDMxIHN0eWtrIHNvbSBwZW5kbGVyIGlubiB0aWwga29tbXVuZW4gb2cgNjYgc3R5a2sgc29tIHBlbmRsZXIgdXQgYXYga29tbXVuZW4uIERldCBrYW4gdsOmcmUgZmxlcmUgc29tIHBlbmRsZXIgaW5uIHRpbCBvZyB1dCBhdiBrb21tdW5lbiBmcmEgYW5kcmUgcmVnaW9uZXIsIG1lbiBoZXIgc2VyIHZpIHRhbGxlbmUgcMOlIGRlIHNvbSBwZW5kbGVyIGkgSGF1Z2FsYW5kc3JlZ2lvbmVuLiAgDQoNClZpIHZldCBhdCBIYXVnZXN1bmQgZXIgcmVnaW9uc2VudHJ1bSBtZWQgc3lrZWh1cyBvZyBow7hnc2tvbGUuIFNhbXRpZGlnIGhhciBIYXVnZXN1bmQgZmxlcmUgb2xqZSBvZyBzasO4ZmFydHNuw6ZyaW5nZXIuICBEZXQgZXIgc2VudHJhbGlzZXJ0IHNvbSBiZXR5ciBhdCBkZXQgZXIgZ3J1bm5sYWcgZm9yIGV0IHN0w7hycmUgam9iYm1hcmtlZC4gRGV0IGVyIMOlcnNha2VuIHRpbCBhdCBIYXVnZXN1bmQgaGFyIG1lciBpbm5wZW5kbGluZyBlbm4gZGUgYW5kcmUga29tbXVuZW5lIGkgcmVnaW9uZW4uIEthcm3DuHkgb2cgVHlzdsOmciBzb20gbGlnZ2VyIG7DpnJtZXN0IEhhdWdlc3VuZCBoYXIgc3TDuHJzdCBhbmRlbCB1dHBlbmRsaW5nLCBvZ3PDpSB0aWwgSGF1Z2VzdW5kLiAgDQoNCmBgYHtyIFBlbmRsaW5nIGkgU3VubmhvcmRsYW5kfQ0Kc3VuX1BlbmRsaW5nDQpgYGANCg0KLSAgIA0KDQpgYGB7ciBzaXN0ZX0NCiMgU2lzdGUNCmBgYA0KDQotICAgDQo=
>>>>>>> 5da4ae6a12c693bac7eb81070bf88ecf7ca96a5e